当前位置:  开发笔记 > 编程语言 > 正文

在.Net中,出于性能原因,我是否应该通过引用传递结构?

如何解决《在.Net中,出于性能原因,我是否应该通过引用传递结构?》经验,为你挑选了2个好方法。

在我的C#应用​​程序中,我有一个大型结构(176字节),每秒可能传递一十万次到一个函数.然后,该函数只需要一个指向struct的指针,并将指针传递给非托管代码.函数和非托管代码都不会对结构进行任何修改.

我的问题是,我应该通过值或引用将结构传递给函数吗?在这种特殊情况下,我的猜测是,通过引用传递比将176个字节推入调用堆栈要快得多,除非JIT碰巧认识到结构永远不会被修改(我的猜测是因为结构体不能识别这个结构)地址被传递给非托管代码)并优化代码.

既然我们正在使用它,那么让我们回答更常见的情况,即函数没有将结构的指针传递给非托管代码,而是对结构的内容执行一些只读操作.通过引用传递结构会更快吗?在这种情况下,JIT会认识到结构永远不会被修改,从而进行优化吗?据推测,通过引用传递一个1字节的结构并不是更有效,但是如果有的话,通过引用传递结构的结构大小会更好吗?

谢谢.

编辑:

如下所述,还可以为常规使用创建"等效"类,然后在传递给非托管代码时使用结构.我在这里看到两个选项:

1)创建一个简单包含结构的"包装器"类,然后在必要时将指针指向结构并传递给非托管代码.我看到的一个潜在问题是钉扎有其自身的性能影响.

2)创建一个等价的类,当需要struct时,其字段被复制到struct.但是复制需要花费很多时间,而且在我看来首先要通过引用来打败它.

编辑:

正如下面提到的几次,我当然可以只测量每种方法的性能.我做到这一点,并发布结果.但是,我仍然有兴趣从知识分子的角度看待人们的答案和推理.



1> Walt D..:

我做了一些非常非正式的分析,结果表明,对于我的特定应用程序,通过引用传递可以获得适度的性能提升.对于按值,我每秒大约有10,050,000个呼叫,而对于按参考,我每秒大约有11,200,000个呼叫.

你的旅费可能会改变.



2> Jon Skeet..:

在你询问是否应该通过引用传递结构之前,你应该问问自己为什么你最初有这么大的结构.它真的需要是一个结构吗?如果您需要在某一时刻的P/Invoke来使用结构,这将是值得拥有的结构只是为,然后等价类的其他地方?

一个大的结构非常非常不寻常......

有关此更多指导,请参阅" 在类和结构之间进行选择"中的"开发类库的设计指南"部分.


这个特定的结构直接传递给硬件设备驱动程序,所以是的,在我的情况下它**需要是一个结构.现在我发现我可以将结构包装在一个类中,然后在需要指针时固定结构,但是固定可能会引入其他性能问题.
推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有