2017-09-24 42 views
6

我有一些编码方面的经验,但最令人讨厌的问题之一是如何改进我的代码。如何衡量我的代码质量?

每次

我检查复杂可读性正确性代码,但我的问题是如何衡量的大小和特定命令的时间。

例如:

时,我有下一个问题:

A是整数

B是整数

C是整数

if - A是bi gger在B分配C=A

else - C=B

对于此问题,我们有2个简单的解决方案 -

使用if-else语句

2.使用三元运算符

对于编译前文件大小的干检查,我得到第二个解决方案文件比第一个少一半(对于1000000次操作,我得到的是一些MB的差异)。

我的问题是如何衡量的一些代码,这使得同样的操作之间,但与不同的命令,多少编译器可以进行优化,接近像2从示例命令的时间差。

+0

说实话,很难衡量这个低时间框架。我对测试人员的回复非常感兴趣,因为测量哪一个更好是相当直接的(写下每次执行后的时间和1000000次操作的平均值),但这不会给你准确的执行时间,而是哪个更快平均。但是,如何准确执行时间对我来说也是一个谜。 –

+1

@安特 - 如果差异太小而无法衡量,为什么我们首先关心? –

+1

执行时间!=适合目的 –

回答

3

分析两种算法的时间复杂度。如果它们看起来有竞争力,则

基准

为您的问题提供足够大的输入,以便时间不受其他-OS-开销的影响。

开发两个解决相同问题但程序不同的程序。

我有一些方法在Time measurements时间码。例如:

#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; 
} 

您将得到一个时间测量。然后,例如,使用“算法2”解决问题,并比较这些测量结果。 PS:或者您可以检查每种方法的汇编代码,以获取更低级别的方法。

2

其中一种方法是在bash shell中使用时间函数,然后重复执行很多次。这将显示哪个更好。并且制作一个不做任何事情的模板,你可以知道缓冲时间。

请在做出任何结论之前对许多情况进行计算并比较平均值。

4

最好也是最直接的方法是检查编译器在不同优化级别生成的汇编代码。

//编辑

我没有提到的标杆,因为你的问题是关于检查使用不同的语言结构做同样的工作,两个源代码之间的差异。

不要误解我的意思,台式机是推荐的一种确保一般软件性能的解决方案,但在这种特殊情况下,由于基本操作的执行时间框架非常短,所以它可能不可靠。 即使您计算来自多次运行的摊销时间,这种差异可能会对操作系统和环境造成很大的依赖,从而污染您的结果。

要了解更多关于这个问题,我建议this talk from Cppcon,这是有趣的有趣。

但最重要的,通过探索汇编代码可以给你的信息是否两条语句引擎盖下

快速窥视已被优化到完全相同的代码。从基准代码中可能不太清楚。

如果你问(如果对比tenary操作符),它应该总是导致相同的机器代码,因为tenary操作符只是一个语法糖,因为if和physical在实际上是相同的操作。

+0

如果您有足够的经验优化代码的速度,并因此获得了对Agner Fog指令表的良好回忆;有时只需要快速浏览汇编输出以确定更好的代码......或者在优化开始时没有区别,您只需使用更简单的代码即可。拥有越来越多的经验越来越难。 – technosaurus