gpt4 book ai didi

c# - 在 .Net 中,出于性能原因,我什么时候应该通过引用传递结构?

转载 作者:可可西里 更新时间:2023-11-01 03:09:29 26 4
gpt4 key购买 nike

在我的 C# 应用程序中,我有一个很大的结构(176 字节),它每秒可能被传递给一个函数十万次。这个函数然后简单地获取一个指向结构的指针并将指针传递给非托管代码。函数和非托管代码都不会对该结构进行任何修改。

我的问题是,我应该按值还是按引用将结构传递给函数?在这种特殊情况下,我的猜测是通过引用传递比将 176 个字节压入调用堆栈要快得多,除非 JIT 碰巧认识到该结构从未被修改(我的猜测是它无法识别这一点,因为该结构的地址传递给非托管代码)并优化代码。

既然已经到了,我们还要回答更一般的情况,即函数将结构的指针传递给非托管代码,而是对结构的内容执行一些只读操作结构。通过引用传递结构会更快吗?在这种情况下,JIT 会认识到结构从未被修改并因此进行优化吗?据推测,通过引用传递 1 字节的结构不会更有效,但是在什么结构大小下通过引用传递结构会变得更好(如果有的话)?

谢谢。

编辑:

正如下面所指出的,也可以创建一个“等效”类供常规使用,然后在传递给非托管代码时使用结构。我在这里看到两个选项:

1) 创建一个仅包含该结构的“包装器”类,然后在必要时将指向该结构的指针固定并传递给非托管代码。我看到的一个潜在问题是固定有其自身的性能影响。

2) 创建一个等效类,当需要该结构时,其字段被复制到该结构。但是复制会花费很多时间,而且在我看来首先打败了通过引用传递的意义。

编辑:

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

最佳答案

我做了一些非常非正式的分析,结果表明,对于我的特定应用程序,通过引用传递有适度的性能提升。对于按值,我每秒收到大约 10,050,000 次调用,而对于通过引用,我每秒收到大约 11,200,000 次调用。

您的里程可能会有所不同。

关于c# - 在 .Net 中,出于性能原因,我什么时候应该通过引用传递结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/481314/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com