我有一些编码方面的经验,但令我烦恼的最大问题之一是如何改进我的代码。
我每次检查代码的复杂性,可读性和正确性,但我的问题是我如何衡量尺寸和特定命令的时间。
例如:
当我遇到下一个问题时:
A
是一个整数
B
是一个整数
C
是一个整数
if
- A更大,B分配C=A
else
- C=B
对于这个问题,我们有两个简单的解决方案 -
1。使用if-else语句
2. 使用三元运算符
在编译之前干燥检查文件的大小,我得到第二个解决方案文件少于第一个一半(对于1000000个操作,我得到一些MB的差异)。
我的问题是我如何衡量一些代码之间的时差,这些代码执行相同的操作但使用不同的命令,以及编译器对命令进行优化的程度与示例中的2很接近。
答案 0 :(得分:4)
最好也是最直接的方法是检查编译器在不同优化级别生成的汇编代码。
<强> //修改
我没有提及基准测试,因为您的问题是使用不同的语言结构检查两个源代码之间的差异,以执行相同的工作。
不要误会我的意思,制作平台是建议确保一般软件性能的解决方案,但在这种特殊情况下,它可能是不可靠的,因为基本操作的执行时间框架非常小。 即使您计算多次运行的摊销时间,差异可能在很大程度上取决于操作系统和环境,从而污染您的结果。
要了解有关此主题的更多信息,我建议this talk from Cppcon,这实际上很有趣。
但最重要的是,
通过探索汇编代码快速浏览一下,可以向您提供有关两个语句是否已经优化为完全相同的代码的信息。通过对代码进行基准测试可能不太清楚。
如果您询问(如果是vs tenary运算符)它应该总是导致相同的机器代码,因为tenary运算符只是if和物理上它实际上是相同操作的语法糖。
答案 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 :(得分:2)
其中一种方法是在bash shell中使用time函数,然后重复执行很多次。这将显示哪个更好。并制作一个两者都不做的模板,你可以知道缓冲时间。
在做出任何结论之前,请对许多案例进行计算并比较平均值。