在托管代码中,我应该保持什么才能保持良好的性能?

Tam*_*ash 7 c# performance garbage-collection unmanaged managed

我原来是C++程序员,在C++程序中,程序中的每个进程都绑定到您的代码,即除非您希望它发生,否则什么都不会发生.并且根据您编写的内容分配(并释放)每个内存.因此,性能是您的全部责任,如果您做得好,您将获得出色的表现.

(注意:请不要抱怨没有自己编写的代码,如STL,毕竟这是一个C++非托管代码,这是重要的部分).

但是在托管代码中,例如Java和C#中的代码,您无法在某种程度上控制每个进程,内存是"隐藏"的,或者不受您的控制.这使得性能相对不为人知,大多数情况下你担心性能不佳.

所以我的问题是:我应该关注哪些问题和粗线,并牢记在托管代码中实现良好的性能?

我只能想到一些做法,例如:

  • 意识到拳击和拆箱.
  • 选择最能满足您需求并且运营成本最低的正确产品系列.

但这些似乎永远不够,甚至令人信服!实际上也许我不应该提到它们.

请注意我不是要求C++ VS C#(或Java)代码比较,我刚才提到C++来解释这个问题.

Mar*_*ell 5

这里没有单一的答案.回答这个问题的唯一方法是:个人资料.尽早测量并经常测量.瓶颈通常不在你期望的地方.优化实际受伤的事物.我们使用mvc-mini-profiler,但任何类似的工具都可以使用.

你似乎专注于GC; 现在,这可以有时是一个问题,但通常只有在特定的情况下; 对于大多数系统而言,代际GC工作得很好.

外部资源显然会很慢; 缓存可能是至关重要的:在具有非常长寿命数据的奇怪场景中,您可以使用结构来避免长期GEN-2收集; 序列化(文件,网络等),物化(ORM),或者只是糟糕的收集/算法选择可能是最大的问题 - 在测量之前你无法知道.


但有两件事:

  • 确保你明白IDisposable和"使用"的含义
  • 不要在循环中连接字符串; 大规模连接是StringBuilder的工作