找到性能瓶颈
二八法则适合很多事物:最重要的只占其中一小部分,约20%,其余80%的尽管是多数,却是次要的。在程序代码中也是一样,决定应用性能的就那20%的代码(甚至更少)。因此优化实践中,我们将精力集中优化那20%最耗时的代码上,这那20%的代码就是程序的性能瓶颈,主要针对这部分代码进行优化。
常见优化方法:
这部分我就不写,直接参见《性能调优攻略》,因为我没有自信能写出比这更好的。
如果不想这么深入地了解,看看《C++程序常见的性能调优方式》这篇文章也是不错的。
应用案例
我们以一个应用案例来讲解,以至于不会那么乏味难懂。
我们知道能被1和它本身整除的整数叫质数,假设1到任意整数N的和为Sn(Sn=1+2+3+…+n)。现在要求10000到100000之间所有质数和Sn。
可能你会觉得这问题不是So Easy吗!都不用脑袋想,咣当一下就把代码写完了,代码如下:
#include <iostream> #include <windows.h> // 定义64位整形 typedef __int64 int64_t; // 获取系统的当前时间,单位微秒(us) int64_t GetSysTimeMicros() { // 从1601年1月1日0:0:0:000到1970年1月1日0:0:0:000的时间(单位100ns) #define EPOCHFILETIME (116444736000000000UL) FILETIME ft; LARGE_INTEGER li; int64_t tt = 0; GetSystemTimeAsFileTime(&ft); li.LowPart = ft.dwLowDateTime; li.HighPart = ft.dwHighDateTime; // 从1970年1月1日0:0:0:000到现在的微秒数(UTC时间) tt = (li.QuadPart - EPOCHFILETIME) / 10; return tt; } // 计算1到n之间所有整数的和 int64_t CalculateSum(int n) { if (n < 0) { return -1; } int64_t sum = 0; for (int i = 0; i < n; i++) { sum += i; } return sum; } // 判断整数n是否为质数 bool IsPrime(int n) { if (n < 2) { return false; } for (int i = 2; i < n; i++) { if (n %i == 0) { return false; } } return true; }
void main() { int64_t startTime = GetSysTimeMicros(); int count = 0; int64_t sum = 0; for (int i = 10000; i <= 100000; i++) { if (IsPrime(i)) { sum = CalculateSum(i); std::cout << sum << "\t