我有一个C应用程序,其中的一个工作是调用一个可执行文件。该文件在编译期间在中间代码级别插入了性能测量例程。它可以测量时间或L1/L2/L3缓存未命中。换句话说,我修改了LLVM编译器以插入对该函数的调用,并将结果打印到stdout
以获得任何已编译的程序。如何在C程序运行时正确调用可执行文件?
现在,就像我在开始时提到的那样,我想从单独的C应用程序执行程序(该结果返回到stdout
)并保存该结果。我这样做是正确的,现在的方式是:
void executeProgram(const char* filename, char* time) {
printf("Executing selected program %s...\n", filename);
char filePath[100] = "/home/michal/thesis/Drafts/output/";
strcat(filePath, filename);
FILE *fp;
fp = popen(filePath, "r");
char str[30];
if (fp == NULL) {
printf("Failed to run command\n");
exit(1);
}
while (fgets(str, sizeof(str) - 1, fp) != NULL) {
strcat(time, str);
}
pclose(fp);
}
其中filename
是名称的编译的可执行文件运行。结果保存为time
字符串。
问题是,我得到的结果与通过从命令行(./test16
)手动运行可执行文件返回的结果相比,是非常不同和不稳定的。它们看起来像:
231425
229958
230450
228534
230033
230566
231059
232016
230733
236017
213179
90515
229775
213351
229316
231642
230875
因此,他们大多在23万美国,有一些偶然的下降。同样的可执行文件,从其他应用程序中运行,生产:
97097
88706
91418
97970
97972
94597
95846
95139
91070
95918
107006
89988
90882
91986
90997
88824
129136
94976
102191
94400
95215
95061
92115
96319
114091
95230
114500
95533
102294
108473
105730
注意,它是相同的可执行文件,被呼叫。然而,它返回的测量时间是不同的。正在测量的程序包括对简单嵌套循环的函数调用,访问数组元素。下面是代码:
#include "test.h"
#include <stdio.h>
float data[1000][1000] = {0};
void test(void)
{
int i0, i1;
int N = 80;
float mean[1000];
for (i0 = 0; i0 < N; i0++)
{
mean[i0] = 0.0;
for (i1 = 0; i1 < N; i1++) {
mean[i0] += data[i0][i1];
}
mean[i0] /= 1000;
}
}
我怀疑有,也许过程中应分叉一些错误的程序代码调用的方式还是什么?有任何想法吗?
哦,对不起,我已经把时间单位弄糊涂了,实际上时间只有几微秒。好吧,我会尽力解释它。 –
当您从“其他应用程序”执行时,您是否使用循环调用多次?像'for(i = 0; i <20; ++ i)executeProgram(...)' – 4386427
我不这样做,它只运行一次 –