未初始化的本地人引起的维护问题(尤其是指针)对于任何做过一些c/c++维护或增强的人来说都是显而易见的,但我仍然看到它们并且偶尔听到作为它们的理由给出的性能影响。在c中很容易证明冗余初始化已被优化:$lesstest.c#includemain(){#ifdefINIT_LOCinta=33;intb;memset(&b,66,sizeof(b));#elseinta;intb;#endifa=0;b=0;printf("a=%i,b=%i\n",a,b);}$gcc--versiongcc(GCC)3.4.4(cygmingspecial,gdc0.12,usingdmd0.125)
未初始化的本地人引起的维护问题(尤其是指针)对于任何做过一些c/c++维护或增强的人来说都是显而易见的,但我仍然看到它们并且偶尔听到作为它们的理由给出的性能影响。在c中很容易证明冗余初始化已被优化:$lesstest.c#includemain(){#ifdefINIT_LOCinta=33;intb;memset(&b,66,sizeof(b));#elseinta;intb;#endifa=0;b=0;printf("a=%i,b=%i\n",a,b);}$gcc--versiongcc(GCC)3.4.4(cygmingspecial,gdc0.12,usingdmd0.125)
有点奇怪:一位friend不久前告诉我,重新安排这个示例for循环来自:for(inti=0;i到:for(inti=0;constant>i;++i){//code...}会略微提高C++的性能。我看不出将常量值与变量进行比较比反之亦然更快,而且我运行的一些基本测试没有显示两种实现之间的速度有任何差异。测试这个Pythonwhile循环也是如此:whilei对比:whileconstant>i:#code...i+=1我错了吗?我的简单测试不足以确定速度变化吗?其他语言也是这样吗?或者这只是一个新的最佳实践? 最佳答案 它更像是C
有点奇怪:一位friend不久前告诉我,重新安排这个示例for循环来自:for(inti=0;i到:for(inti=0;constant>i;++i){//code...}会略微提高C++的性能。我看不出将常量值与变量进行比较比反之亦然更快,而且我运行的一些基本测试没有显示两种实现之间的速度有任何差异。测试这个Pythonwhile循环也是如此:whilei对比:whileconstant>i:#code...i+=1我错了吗?我的简单测试不足以确定速度变化吗?其他语言也是这样吗?或者这只是一个新的最佳实践? 最佳答案 它更像是C
当您知道您的软件(不是驱动程序,不是操作系统的一部分,只是一个应用程序)将主要在虚拟化环境中运行时,是否有策略来优化您的代码和/或编译器设置?或者任何关于你应该做什么和不应该做什么的指南?这不是关于0.0x%的性能提升,而是可能,只是可能有一些简单的事情会显着提高性能,或者一些看似简单但已知在虚拟化环境中会造成灾难性的事情。例如,在内核构建中启用CONFIG_PARAVIRT很容易完成,并且可以大大提高性能。现在我正在为应用程序寻找类似的东西,如果有的话。在我的情况下,它将是C++代码,可能是VMWare,但我想尽可能地保持这个问题与语言/产品无关。我想知道是否有这样的策略,或者这是否
当您知道您的软件(不是驱动程序,不是操作系统的一部分,只是一个应用程序)将主要在虚拟化环境中运行时,是否有策略来优化您的代码和/或编译器设置?或者任何关于你应该做什么和不应该做什么的指南?这不是关于0.0x%的性能提升,而是可能,只是可能有一些简单的事情会显着提高性能,或者一些看似简单但已知在虚拟化环境中会造成灾难性的事情。例如,在内核构建中启用CONFIG_PARAVIRT很容易完成,并且可以大大提高性能。现在我正在为应用程序寻找类似的东西,如果有的话。在我的情况下,它将是C++代码,可能是VMWare,但我想尽可能地保持这个问题与语言/产品无关。我想知道是否有这样的策略,或者这是否
如果没有定义TEST宏,我想知道这两段代码是否存在性能差异:voidFunc1(inta){//...}#ifdefTESTFunc1(123);#endif和:voidFunc2(inta){#ifdefTEST//...#endif}Func2(123);如果没有定义TEST,Func2将成为编译器根本不应该调用的空函数,不是吗? 最佳答案 这很大程度上取决于对Func2的特定调用是否是内联的。如果是,那么优化编译器应该能够对空函数进行内联调用,就像根本不调用它一样。如果它不是内联的,那么它会被调用并立即返回。只要函数定义在包含
如果没有定义TEST宏,我想知道这两段代码是否存在性能差异:voidFunc1(inta){//...}#ifdefTESTFunc1(123);#endif和:voidFunc2(inta){#ifdefTEST//...#endif}Func2(123);如果没有定义TEST,Func2将成为编译器根本不应该调用的空函数,不是吗? 最佳答案 这很大程度上取决于对Func2的特定调用是否是内联的。如果是,那么优化编译器应该能够对空函数进行内联调用,就像根本不调用它一样。如果它不是内联的,那么它会被调用并立即返回。只要函数定义在包含
在c++中,什么是估算内联函数的计算时间优势的良好启发式方法,特别是当函数被非常频繁地调用并且占程序执行时间的>=10%时(例如,蛮力或随机优化过程)。尽管内联最终可能超出我的控制范围,但我仍然很好奇。 最佳答案 没有普遍的答案。这取决于硬件、数量和它的参数的类型,以及在函数中做了什么。以及多久它被称为,在哪里。例如,在Sparc上,参数(以及返回值)在寄存器中传递,每个函数得到16个新的寄存器:如果函数足够复杂,那些新的寄存器可能避免在函数被内联时发生的溢出,并且非内联版本最终可能比内联版本更快。在英特尔上,这是寄存器差,并在寄存
在c++中,什么是估算内联函数的计算时间优势的良好启发式方法,特别是当函数被非常频繁地调用并且占程序执行时间的>=10%时(例如,蛮力或随机优化过程)。尽管内联最终可能超出我的控制范围,但我仍然很好奇。 最佳答案 没有普遍的答案。这取决于硬件、数量和它的参数的类型,以及在函数中做了什么。以及多久它被称为,在哪里。例如,在Sparc上,参数(以及返回值)在寄存器中传递,每个函数得到16个新的寄存器:如果函数足够复杂,那些新的寄存器可能避免在函数被内联时发生的溢出,并且非内联版本最终可能比内联版本更快。在英特尔上,这是寄存器差,并在寄存