返回多个双精度值的方法有多种实现方式:
通过out
参数:
class MyClass
{
static double Add3(double x, out double xp1, out double xp2)
{
xp1 = x + 1.0;
xp2 = x + 2.0;
return x + 3.0;
}
}
通过元组:
class MyClass
{
static Tuple<double, double, double> Add3(double x)
{
Tuple<double, double, double> ret = new Tuple<double, double, double>();
ret.Item1 = x + 1.0;
ret.Item2 = x + 2.0;
ret.Item3 = x + 3.0;
return ret;
}
通过一个类收集结果:
class MyClass
{
class Result
{
double xp1;
double xp2;
double xp3;
}
static Result Add3(double x)
{
Result ret = new Result
{
xp1 = x + 1.0;
xp2 = x + 2.0;
xp3 = x + 3.0;
}
return ret;
}
}
从对这个问题的评论中我的印象是,人们通常认为带额外类的方法是最佳实践。但是,我想知道关于这三种变体对运行时性能的影响是否有一条经验法则。
与out
参数相比,Tuple
或类的构造函数是否需要额外的时间?
out
参数的变体是否具有任何性能优势?double zPlus3 = MyClass.Add3(z, out _, out _)
为了给这个问题添加一些硬事实,这里有一个比较这些替代方案性能的基准测试项目。
令人惊讶的是。net对ValueTuple和KeyValuePair进行了大量优化,与调试相比,发布模式下的执行时间减少了34倍!
在发布模式下,所有的实现都有相似的速度,除了返回Tuple{int,int}
由于高容量的垃圾收集,速度慢了10倍。在调试模式下,只有使用out - parameter的方法是快速的。从调试到发布版本的相对速度因子在最后一列'*'
中给出。通过Tuple<T1,T2,T3>
或具有3个属性的自定义类返回多个值,在性能方面是等效的。元组更容易获得(不需要编写代码),而自定义类更方便使用,但这两种方法都涉及引用类型的实例化,必须进行堆分配,然后进行垃圾收集。如果您使用这些类型只是为了访问它们的属性一次,那么您不会获得任何附加价值来补偿堆分配/垃圾收集开销。在这种情况下,使用out
参数具有更好的性能。然而,还有第四种解决方案,它结合了所有这些方法的优点:值元组(在c# 7.0及更高版本中可用)。
static (double, double, double) Add3(double x)
{
return (x + 1.0, x + 2.0, x + 3.0);
}
使用示例,演示元组解构:
(double xp1, double xp2, double xp3) = Add3(13);
…或者等价地使用类型推断:
var (xp1, xp2, xp3) = Add3(13);
优势:
ValueTuple<T1,T2,T3>
和Tuple<T1,T2,T3>
一样容易获得。- 语言支持将
ValueTuple<T1,T2,T3>
的字段名更改为比Item1
,Item2
和Item3
更有意义的东西,使它们(几乎)与自定义类一样方便。 - 和
out
参数一样,ValueTuple<T1,T2,T3>
也存储在堆栈中。不涉及堆分配和垃圾收集。
相关内容
- Numpy.tensordot 给出错误"tuple index out of range"
- 不确定导致错误的原因"Tuple index out of range"
- " IndexError: tuple index out of range "作为数据流模板作业的
- 在Python中实现高斯过滤器,Error: IndexError: tuple index out of range.
- 多个返回变量-哪个具有最佳性能(out, tuple, class)?
- FASTAI:"LSTM"对象没有属性"out"&attributeerror "tuple"对象没有属性"view"
- "IndexError: tuple index out of range" train_test_split训练数据一次尝试适合预处理
- 更改循环次数时的"Tuple index out of range"
- 不明白为什么会出现"Tuple index out of range"错误
- Pyinstaller 和 py2exe 导致错误:"tuple index out of range"
- 如何修复 python 中的"IndexError: tuple index out of range"?
- 如何修复 sklearn fit_transform 上的'tuple index out of range'错误?
- 熊猫数据帧错误"tuple index out of range"
- 不了解格式化字符串时"IndexError: tuple index out of range"的原因
- py2exe.mf3._scan_opcodes "tuple index out of range"的含义是什么?
- 重新塑造返回"IndexError: tuple index out of range"的 NParray
- 如何在进行图像分割时修复"tuple index out of range"?
- psycopg2 "IndexError: tuple index out of range" 使用带有参数元组的类似运算符'%'错误
- 蟒蛇 - "tuple index out of range"
- numpy.savetxt "tuple index out of range" ?
最新更新
- 在初始页面加载时未应用FacetWP查询顺序数组设置
- GitHub邀请过期吗?
- 使用AWS秘密管理器端点的安全组
- 如何做基于名称和值的点击事件?
- 在容器和主机上创建具有相同Linux用户id的用户
- Firebase身份验证在部署后不工作.扑动Web应用程序显示空白的白色屏幕
- AWS Client VPN Access Public URL/IP
- python dict get方法即使key在dict中也运行第二个参数
- 如何在Python中使用每周时间序列
- Scss函数没有返回计算值
- 如何使用conduit获取一个lazy ByteString并将其写入文件(在恒定内存中)
- c -内存分配器-简单隔离存储:你如何从它的地址推断分配块的大小?
- 获取JSON格式的Discord PY对象
- 如何为作为prop传入的React组件设置类型
- 在c++中使用new时是否按顺序分配内存?
- 你可以暂时复制谷歌云图像文件在Python?
- PHP cURL 一个帖子但两次(双)它是相同的数据到数据库与 API
- 405 (Method Not Allowed)错误的ajax在Laravel 8
- Sicstus:一个模块和CWD
- Laravel在模型中有onethrough关系
- Whiptail:当一个仪表正在运行时,我该如何处理一个错误?
- 关于Sacha Willems的示例代码的Vulkan屏幕外渲染问题
- 有人可以分解nums[i] = nums[i-1] + nums[i]做什么?(Python) &g
- 如何在 Qwidget 上绘制二维码,我在 Windows 10 上使用 Qt Creator C++
- Fluentd td-agent.log文件大小持续增加
- 暂停javascript for循环,同时等待从突变观察者的响应?
- Jetpack撰写更新广告横幅在Android视图
- 在ASP中构建级联下拉列表的问题. NET Core 7 MVC使用JQuery和ajax.googleapis.com
- 在EAS中找不到"expo dev client"错误所依赖的"expo devel la
- 需要帮助在文件之间本地共享Javascript变量
热门标签:
javascript python java c# php android html jquery c++ css ios sql mysql arrays asp.net json python-3.x ruby-on-rails .net sql-server django objective-c excel regex ruby linux ajax iphone xml vba spring asp.net-mvc database wordpress string postgresql wpf windows xcode bash git oracle list vb.net multithreading eclipse algorithm macos powershell visual-studio image forms numpy scala function api selenium