为什么无GC的编程语言比有GC的编程语言性能更快?
我希望 C/C++ 程序员能大胆地说 GC 比 shared_ptr 快!有时甚至比 new/delete 快。这在理论上是完全能解释的。(很多同学忘记考虑缓存局域性,就分析错了。二是对 GC 算法理解有误,例如 GC 不需要遍历垃圾的对象图,也没有额外 bookkeeping 损耗。)详情见:
李杭帆:○乎程序员 C++ 平均水平倒退得有多厉害?另外,
Unity 为了甩锅,掩盖当初选择的技术路线的缺陷和自己的拉跨,一直在甩锅 .NET 和 GC。而游戏研发又和 C/C++ 有一定的重合度,Unity 和 Unreal 也经常对比,中文社区里有相当部分的 GC 性能谣言都和 Unity 有关!
实际上 Unreal 也能用 C# 和 .NET 的 GC。实际上 Unreal 也能用 C# 和 .NET 的 GC。
https://github.com/UnrealSharp/UnrealSharp如果你用同一套 C# 代码做测试,就能发现 Unity 的性能拉跨之处了。完全是 Unity 自己的问题。而他们总是宣称是 GC 拖慢了。还说 C# 当个脚本(脚本有 1. 脚本语言和 2. 从此引申的引擎代码外承载游戏业务和逻辑代码 的两个义项),脚本是这样的,凑合用得了。总之就是不承认自己的问题。同时也利用 C/C++ 性能高的观感给自己贴金,转而甩锅给 .NET、GC、C#。
实际上,Unity 采用的内存模型,也即混合指针和不移动对象 GC(具体用的是 Boehm-Demers-Weiser conservative GC)是性能最低的一种类别的建模。相当于,手动堆分配和 GC 的缺点都继承了。而性能优点是没有的。(这种方案在技术上最为简单,也方便实现一些 hack 或魔改 Mono runtime。)还会造成一些其他问题,例如 null 值的判断。
Unity 毫无疑问是 .NET 社区和游戏公司的吸血鬼。它的恶可不止上面说的这些。还有,违反协议抄袭代码(以前很多,现在有所减少),抄就算了,还故意在没有必要的情况下将算法代码耦合为他们那不怎么聪明的那一套,失去通用性增加用户黏度。等等损人而利己。