【发布时间】:2019-09-22 17:00:52
【问题描述】:
我进行了以下测试。
charspeed.c
#include <stdio.h>
#include <time.h>
#define CHAR_COUNT 26
#define CHAR_LIST "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
static const char *CHAR_ARRAY = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
#define RUN_COUNT 1000000000
#define GET_CLOCK (float)clock() / CLOCKS_PER_SEC
int main()
{
long long int sum = 0;
float start, end;
start = GET_CLOCK;
for (size_t i = 0; i < RUN_COUNT; i++)
{
char test = CHAR_LIST[i % CHAR_COUNT];
sum += test; // Force the loop to run!
}
end = GET_CLOCK;
printf("#define Time: %f\n", end - start);
start = GET_CLOCK;
for (size_t i = 0; i < RUN_COUNT; i++)
{
char test = CHAR_ARRAY[i % CHAR_COUNT];
sum += test; // Must be the same as fist loop!
}
end = GET_CLOCK;
printf("static const *CHAR_ARRAY Time: %f\n", end - start);
printf("sum = %lld\n", sum); // Must access "sum" after loops!
return 0;
}
它的输出
#define Time: 1.741000static const *CHAR_ARRAY Time: 1.868000
为什么使用#define 指令的字符串文字比预初始化的静态字符数组更快?字符串文字的确切存储位置以及为什么在块范围内访问它们更快?
使用的编译器选项是gcc -o charspeed charspeed.c
【问题讨论】:
-
字符串文字是静态字符数组。你是如何编译这个程序的?
-
在 windows 上使用 mingw gcc。
-
CHAR_ARRAY是一个指针。您可能想尝试char REAL_ARRAY[] = "FOO"; -
简短回答:这不是 更长的回答:您的测试不足以证明一般性能差异。对程序进行一些调整,你最终会得到相反的结果
-
不优化编译会使基准测试毫无用处。使用
-O2编译。
标签: c benchmarking