Biz*_*zzu 6 c optimization performance
我有一些编码经验,但令我烦恼的最大问题之一是如何改进我的代码.
我每次都检查代码的复杂性,可读性和正确性,但我的问题是我如何测量特定命令的大小和时间.
例如:
当我有下一个问题:
A
是一个整数
B
是一个整数
C
是一个整数
if
- A指定的A越大 C=A
else
- C=B
对于这个问题,我们有2个简单的解决方案 -
1.使用if-else语句
2.使用三元运算符
为了在编译之前干燥检查文件的大小,我得到的是第二个解决方案文件少于第一个半部分(对于1000000个操作,我得到一些MB的差异).
我的问题是我如何测量一些代码之间的时间差,这些代码执行相同的操作但是使用不同的命令,以及编译器对命令进行优化的程度与示例中的2相近.
最好和最直接的方法是在不同的优化级别上检查由编译器生成的汇编代码。
//编辑
我没有提到基准测试,因为您的问题是关于使用不同的语言构造来完成两个工作来检查两个源代码之间的差异。
别误会,建议使用基准测试来确保总体软件性能,但是在这种特定情况下,由于基本操作的执行时间非常短,因此它可能不可靠。即使从多个运行计算摊销时间,差异也可能很大程度上取决于操作系统和环境,因此会污染您的结果。
要了解有关此主题的更多信息,我建议Cppcon进行此演讲,这确实有点有趣。
但最重要的是
通过探究汇编代码,可以快速窥视一下,从而为您提供两个语句是否已优化为完全相同的代码的信息。从对代码进行基准测试可能还不清楚。
在您询问的情况下(如果是tenant运算符),它应该总是导致相同的机器代码,因为tenary运算符只是if和物理上实际上是同一操作的语法糖。
分析两种算法的时间复杂度。如果他们看起来很有竞争力,
基准。
为您的问题提供足够大的输入,以便计时不受其他操作系统开销的影响。
开发两个程序来解决相同的问题,但采用不同的方法。
我在时间测量和时间代码中有一些方法。例子:
#include <sys/time.h>
#include <time.h>
typedef struct timeval wallclock_t;
void wallclock_mark(wallclock_t *const tptr)
{
gettimeofday(tptr, NULL);
}
double wallclock_since(wallclock_t *const tptr)
{
struct timeval now;
gettimeofday(&now, NULL);
return difftime(now.tv_sec, tptr->tv_sec)
+ ((double)now.tv_usec - (double)tptr->tv_usec) / 1000000.0;
}
int main(void)
{
wallclock_t t;
double s;
wallclock_mark(&t);
/*
* Solve the problem with Algorithm 1
*/
s = wallclock_since(&t);
printf("That took %.9f seconds wall clock time.\n", s);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
您将得到一个时间测量值。然后,您可以使用“算法 2”等解决问题,并比较这些测量结果。
PS:或者您可以检查每种方法的汇编代码,以获得更底层的方法。