正在加载图片...
提高性能的十二条建议-3 提高性能的十二条建议-4 ■在 Release:模式时,删除一切调试信息 用记录文件 profiling)的方法找到关键段 for(nt=1;K≤=n++) 在VC中选择菜单 Project> Setting bes=best1]+1;∥假设10时的结果不对 if (i==10&& best(o]l= 26 )cout<<Wrong Answer! 调试结束后,可能会忘记删除上面的语句 αa好的风格是使用 DEBUG宏 if(i==10&& best(0)I= 26 )cout<< Wrong Answer! #endf∥ ifdef debug 提高性能的十二条建议-4 提高性能的十二条建议-4 ■测试程序如下 ■选择Buid-> Profile菜单项生成记录文件 int maino( ■记录文件的结果如下 for(=0,10:计++)for(=0:j<10;j+) FuncAO;∥执行了100次 for(=0,K100;计++)for(j=0j100;j++) →157590115.77590,11000 FuncBI(vod uncB0;∥执行了10000次 .162 0.9 100 FuncA (void ■关键段 FuncT显而易见 提高性能的十二条建议-5 提高性能的十二条建议-6 ■避免在关键段使用依赖于其他进程的变量 ■深入了解在关键段中使用的复杂对象 a对于多进程/线程的程序 a比如,该对象是否有拷贝构造函数? 如果关键段的运行需要另一个进程A来提供一个 a该对象的赋值(-)操作是如何实现的,拷贝还是 量b,那么关键段每次循环都需要A执行一次 引用? 都需要两次进程间切换,而进程切换是相当慢的 a如果是拷贝实现的话,由于拷贝复杂对象很慢 ωa通过合理的设计,把关键段和A放到相同的进程 可以采用引用(&)的方法来避免赋值(=)操作和拷 内,比如可以用不同的线程 贝构造提高性能的十二条建议-3 ƒ 在Release模式时,删除一切调试信息 for ( int i=1; i<=n; i++) { best[i] = best[i-1] + 1; // 假设i=10时的结果不对 // …… if ( i==10 && best[i] != 26 ) cout<<“Wrong Answer!”; Z调试结束后,可能会忘记删除上面的语句 Z好的风格是使用DEBUG宏 #ifdef DEBUG if ( i==10 && best[i] != 26 ) cout<<“Wrong Answer!”; #endif // ifdef DEBUG 提高性能的十二条建议-4 ƒ 用记录文件(profiling)的方法找到关键段 Z在VC中选择菜单Project->Setting… 提高性能的十二条建议-4 ƒ 测试程序如下 int main() { int i, j; for ( i=0; i<10; i++) for ( j=0; j<10; j++) FuncA(); // 执行了100次 for ( i=0; i<100; i++) for ( j=0; j<100; j++) FuncB(); // 执行了10000次 return 0; } 提高性能的十二条建议-4 ƒ 选择Build->Profile菜单项生成记录文件 ƒ 记录文件的结果如下 Func Func+Child Hit Time % Time % Count Function --------------------------------------------------------- 15.775 90.1 15.775 90.1 10000 FuncB(void) 1.567 9.0 17.504 100.0 1 _main 0.162 0.9 0.162 0.9 100 FuncA(void) ƒ 关键段FuncB显而易见 提高性能的十二条建议-5 ƒ 避免在关键段使用依赖于其他进程的变量 Z对于多进程/线程的程序 Z如果关键段的运行需要另一个进程A来提供一个 变量b,那么关键段每次循环都需要A执行一次, 都需要两次进程间切换,而进程切换是相当慢的 Z通过合理的设计,把关键段和A放到相同的进程 内,比如可以用不同的线程 提高性能的十二条建议-6 ƒ 深入了解在关键段中使用的复杂对象 Z比如,该对象是否有拷贝构造函数? Z该对象的赋值(=)操作是如何实现的,拷贝还是 引用? Z如果是拷贝实现的话,由于拷贝复杂对象很慢, 可以采用引用(&)的方法来避免赋值(=)操作和拷 贝构造
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有