首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >您使用哪些简单的技术来提高性能?

您使用哪些简单的技术来提高性能?
EN

Software Engineering用户
提问于 2010-09-25 23:03:13
回答 15查看 6.3K关注 0票数 21

我指的是我们编写简单例程的方式,目的是提高性能,而又不让您的代码更难阅读。例如,这是我们了解到的典型情况:

代码语言:javascript
复制
for(int i = 0; i < collection.length(); i++ ){
   // stuff here
}

但是,当foreach不适用时,我通常会这样做:

代码语言:javascript
复制
for(int i = 0, j = collection.length(); i < j; i++ ){
   // stuff here
}

我认为这是一个更好的方法,因为它只调用一次length方法.我女朋友说这很神秘。你在自己的开发中还有其他简单的技巧吗?

EN

回答 15

Software Engineering用户

发布于 2010-09-25 23:52:00

从您的问题和注释线程来看,听起来您“认为”此代码更改提高了性能,但您并不真正知道它是否提高了性能。

我是肯特贝克氏哲学的粉丝:

“让它起作用,使它正确,使它迅速。”

我改进代码性能的技术,首先是让代码通过单元测试并被很好地分解,然后(特别是对于循环操作)编写一个单元测试来检查性能,然后重构代码或者想出一个不同的算法,如果我选择的算法没有按照预期工作的话。

例如,为了用.NET代码测试速度,我使用NUnit的超时属性编写断言,表示对特定方法的调用将在一定时间内执行。

使用NUnit的超时值属性和您给出的代码示例(以及循环的大量迭代),您实际上可以证明您对代码的“改进”是否确实有助于该循环的完成。

免责声明:虽然这在“微观”级别上是有效的,但它肯定不是测试性能的唯一方法,也没有考虑到在“宏”级别可能出现的问题--但这是一个好的开始。

票数 13
EN

Software Engineering用户

发布于 2010-09-26 16:18:46

请记住,编译器很可能会转到:

代码语言:javascript
复制
for(int i = 0; i < collection.length(); i++ ){
   // stuff here
}

转入:

代码语言:javascript
复制
int j = collection.length();
for(int i = 0; i < j; i++ ){
   // stuff here
}

或者类似的东西,如果collection在循环上保持不变。

如果此代码位于应用程序的时间关键部分,则值得了解是否存在这种情况--或者您是否可以更改编译器选项来做到这一点。

这将保持代码的可读性(正如大多数人所期望看到的那样),同时还可以获得很少的额外机器周期。然后,您可以自由地专注于编译器无法帮助您的其他领域。

注意:如果通过添加或删除元素来更改循环中的collection (是的,我知道这是个坏主意,但确实发生了),那么您的第二个示例要么不会遍历所有元素,要么尝试访问数组的末尾。

票数 11
EN

Software Engineering用户

发布于 2010-09-26 03:40:42

这种优化通常是不推荐的。这部分优化可以很容易地由编译器完成,您使用的是更高级别的编程语言,而不是程序集,所以请在同一级别上考虑。

票数 9
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/7347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档