Bob*_*Bob 78 .net c# optimization
如今优化似乎是一种迷失的艺术.所有程序员都没有从代码中挤出每一盎司的效率吗?经常在雪地里行走五英里的时候这样做?
本着回归丢失的艺术的精神,您知道的简单(或复杂)变化以优化C#/ .NET代码的一些提示是什么?因为它是如此广泛,取决于一个人想要完成什么,它有助于提供你的提示的背景.例如:
StringBuilder
.请参阅底部的链接以了解相关信息.string.Compare
两个字符串比较,而不是做这样的事情string1.ToLower() == string2.ToLower()
到目前为止,普遍的共识似乎是衡量关键.这种方式忽略了这一点:测量不会告诉你什么是错的,或者如果遇到瓶颈会怎么做.我遇到了字符串连接瓶颈一次,不知道该怎么办,所以这些提示很有用.
我甚至发布这个问题的意思是为了解决常见的瓶颈问题,以及在遇到这些问题之前如何避免它们.它甚至不一定是任何人应该盲目遵循的即插即用代码,而是更多关于获得对性能应该被考虑的理解,至少在某种程度上,并且需要注意一些常见的陷阱.
我可以看到,知道为什么提示有用以及应该应用的位置可能会有用.对于StringBuilder
小费,我找到了很久以前在Jon Skeet网站上做过的帮助.
Eri*_*ert 106
如今优化似乎是一种迷失的艺术.
每天都有一次制造显微镜作为艺术品.光学原理知之甚少.部件没有标准化.管子,齿轮和镜片必须由高技术工人手工制作.
目前,显微镜是作为工程学科生产的.物理学的基本原理非常容易理解,现成的部件可以广泛使用,显微镜制造工程师可以做出明智的选择,以便如何最好地优化仪器以完成其设计的任务.
那种表现分析是一种"失落的艺术",是一件非常非常好的事情.这种艺术被作为一门艺术来实践.应该优化它的优化:通过仔细应用可靠的工程原理来解决工程问题.
我一直在问数十多年来多次为我的人们可以用它来优化自己的VBScript/JScript中的/他们的Active Server Pages /他们VB /他们的C#代码"的技巧和窍门"名单.我总是反对这一点.强调"提示和技巧"正是处理绩效的错误方法. 这种方式导致代码难以理解,难以推理,难以维护,通常不会明显快于相应的直接代码.
接近性能的正确方法是将其视为工程问题,就像任何其他问题一样:
这与您解决任何其他工程问题相同,例如添加功能 - 为功能设置以客户为中心的目标,跟踪实现可靠实施的进度,通过仔细调试分析找到问题,并继续迭代直到你发货或失败.性能是一个功能.
对复杂的现代系统进行性能分析需要遵守规则并专注于坚实的工程原则,而不是一揽子,这些技巧很少适用于琐碎或不切实际的情况.我从来没有通过应用提示和技巧解决现实世界的性能问题.
Ree*_*sey 45
得到一个好的探查者.
在没有好的分析器的情况下,即使尝试优化C#(实际上是任何代码),也不要打扰.实际上,同时拥有采样和跟踪分析器实际上有很大帮助.
如果没有一个好的分析器,您可能会创建错误的优化,最重要的是,首先优化不是性能问题的例程.
分析的前三个步骤应始终是1)测量,2)测量,然后3)测量....
Ian*_*cer 21
优化指南:
随着处理器继续加快,大多数应用程序的主要瓶颈不是CPU,而是带宽:片外存储器带宽,磁盘带宽和带宽带宽.
从远端开始:使用YSlow查看为什么您的网站对最终用户来说速度慢,然后返回并修复数据库访问不要太宽(列)而不是太深(行).
在非常罕见的情况下,值得采取任何措施来优化CPU使用率,请注意不要对内存使用产生负面影响:我已经看到"优化",开发人员试图使用内存来缓存结果以节省CPU周期.最终效果是减少可用内存以缓存页面和数据库结果,这使得应用程序运行得更慢!(参见关于测量的规则.)
我也看到了一个'哑'未优化算法击败'聪明'优化算法的情况.永远不要低估编译器编写者和芯片设计人员如何将"低效"循环代码转换为可以完全在片上内存中运行流水线的超高效代码.你的"聪明"的基于树的算法带有一个你认为"有效"的向后计数的内包循环,可以被打败,因为它在执行过程中无法留在片上内存中.(参见关于测量的规则.)
Aar*_*ron 16
使用ORM时,请注意N + 1选择.
List<Order> _orders = _repository.GetOrders(DateTime.Now);
foreach(var order in _orders)
{
Print(order.Customer.Name);
}
Run Code Online (Sandbox Code Playgroud)
如果客户没有急切加载,这可能会导致数次往返数据库.
Sof*_*eek 13
好吧,我必须抛弃我最喜欢的:如果任务足够长时间进行人工交互,请在调试器中使用手动中断.
比.一个分析器,它为您提供了一个调用堆栈和变量值,您可以使用它们来真正了解正在发生的事情.
这样做10-20次,你就会明白优化可能会带来什么样的改变.
如果您将方法识别为瓶颈,但您不知道如何处理它,那么您基本上就会陷入困境.
所以我列出一些东西.所有这些都不是银子弹,你仍然需要分析你的代码.我只是做的东西,你的建议可以做,有时可以帮助.特别是前三个很重要.
人们对真正重要的事情有很好的想法.Stack Overflow充满了一些问题,例如,++i
比"高效" i++
.这是一个真正的性能调优的例子,它基本上与任何语言相同.如果代码只是以某种方式编写"因为它更快",那就是猜测.
当然,你并不是故意编写愚蠢的代码,但如果猜测有效,就不需要分析器和分析技术.
事实是,没有完美的优化代码.但是,您可以在已知系统(或一组系统)上针对已知CPU类型(和计数),已知平台(Microsoft?Mono?),已知框架/ BCL版本优化代码的特定部分,已知的CLI版本,已知的编译器版本(错误,规范更改,调整),已知数量的总和可用内存,已知的程序集源(GAC?disk?remote?),具有来自其他进程的已知后台系统活动.
在现实世界中,使用分析器,并查看重要的位; 通常明显的事情是涉及I/O的任何事情,涉及线程的任何事情(再次,这在版本之间发生巨大变化),以及涉及循环和查找的任何事情,但你可能会惊讶于"明显不好"的代码实际上不是一个问题,什么"明显好"的代码是一个巨大的罪魁祸首.
告诉编译器是什么做的,而不是如何去做.例如,foreach (var item in list)
优于for (int i = 0; i < list.Count; i++)
并且m = list.Max(i => i.value);
优于list.Sort(i => i.value); m = list[list.Count - 1];
.
通过告诉系统您想要做什么,它可以找出最佳方法.LINQ很好,因为在您需要它之前不会计算结果.如果您只使用第一个结果,则不必计算其余结果.
最终(这适用于所有编程)最小化循环并最小化您在循环中执行的操作.更重要的是最小化循环内的循环次数.O(n)算法和O(n ^ 2)算法之间有什么区别?O(n ^ 2)算法在循环内部具有循环.