优化C#/ .NET程序的技巧
这些日子看来,优化似乎是一种失落的艺术。 是不是所有程序员都从代码中挤出每盎司的效率? 在雪地里行走五英里时经常这样做?
本着恢复丢失的艺术的精神,你知道一些关于优化C#/ .NET代码的简单(或者可能是复杂的)更改的提示? 由于它是如此广泛的事情,取决于人们想要完成的事情,它将有助于为您的提示提供背景信息。 例如:
StringBuilder
。 请参阅底部的链接以了解关于此的警告。 string.Compare
比较两个字符串,而不是像string1.ToLower() == string2.ToLower()
迄今为止的普遍共识似乎是衡量的关键。 这种想法忽略了一点:测量不能告诉你什么是错误的,或者如果遇到瓶颈,应该怎么办。 我遇到了字符串连接瓶颈一次,不知道该怎么做,所以这些技巧很有用。
我甚至发布这个观点的目的是找到一个共同瓶颈的地方,以及在碰到它们之前如何避免这些瓶颈。 它甚至不一定是任何人都应该盲目追随的即插即用代码,更重要的是要了解应该考虑性能,至少在某种程度上应该考虑一下,并且有一些常见的缺陷需要注意。
我可以看到,虽然也知道为什么提示是有用的,应该在哪里应用。 对于StringBuilder
提示,我发现了我很久以前在Jon Skeet的网站上的帮助。
这些日子看来,优化似乎是一种失落的艺术。
每天有一次,制造显微镜等作为一门艺术。 光学原理知之甚少。 零件没有标准化。 管子,齿轮和镜头必须由高级技术人员手工制作。
这些天显微镜是作为一个工程学科生产的。 物理学的基本原理非常了解,现成的零件已广泛应用,而显微镜制造工程师可以做出明智的选择,以便如何最佳地优化仪器以执行其设计的任务。
这种表现分析是一种“失落的艺术”,是一件非常非常好的事情。 这门艺术是作为一门艺术而练习的。 应该寻求最优化的方法:通过谨慎应用固体工程原理解决工程问题。
多年来我被问过几十次的“技巧和窍门”,人们可以用它来优化他们的vbscript /他们的jscript /他们的活动服务器页面/他们的VB /他们的C#代码。 我总是抵制这一点。 强调“技巧和诀窍”是处理绩效的错误方式。 这种方式导致代码难以理解,很难推理,难以维护,通常不会比相应的简单代码更快。
处理性能的正确方法是将其视为一个工程问题,就像其他任何问题一样:
这与解决任何其他工程问题相同,如添加功能 - 为功能设置以客户为中心的目标,跟踪制定稳定实施的进度,通过仔细的调试分析找到问题时修复问题,持续迭代直到你运送或失败。 性能是一项功能。
对复杂的现代系统进行性能分析需要严格的纪律,专注于坚实的工程原理,而不是充满琐碎的技巧,而这些技巧只适用于琐碎或不切实际的情况。 我从来没有通过应用技巧和窍门来解决现实世界的性能问题。
获得一个好的分析器。
如果没有一个好的分析器,不要打扰甚至试图优化C#(真的,任何代码)。 它实际上有助于戏剧性地同时拥有一个采样和一个跟踪分析器。
如果没有好的分析器,您可能会创建错误的优化,并且最重要的是,首先优化不是性能问题的例程。
分析的前三步应始终是1)测量,2)测量,然后3)测量....
优化指南:
随着处理器不断加速,大多数应用程序的主要瓶颈不是CPU,而是带宽:片外存储器带宽,磁盘带宽和网络带宽。
从远端开始:使用YSlow了解为什么您的网站对最终用户来说很慢,然后回退并修复您的数据库访问不是太宽(列)而不是太深(行)。
在极少数情况下,为了优化CPU使用率而做任何事情都要值得注意,请注意不要对内存使用产生负面影响:我已经看到“优化”,开发人员尝试使用内存来缓存结果以节省CPU周期。 最终结果是减少了可用内存以缓存页面和数据库结果,这使应用程序运行速度变慢了! (请参阅关于测量的规则。)
我还看到了一个“愚蠢的”未优化算法打败了“聪明”优化算法的案例。 千万不要低估编译器和芯片设计师在将低效的循环代码转换为完全可以在流水线内执行片上内存的超高效代码方面的表现。 基于树的算法具有解开的内部循环向后计数,您认为它是“高效的”,可能会被打败,因为它在执行期间无法保留在片内存储器中。 (请参阅关于测量的规则。)
链接地址: http://www.djcxy.com/p/40363.html