我从program1访问共享库(共享数组数据结构),并找到访问该时间来读取该数组的所有元素。 我得到大约17000个滴答,而只有Program1单独执行。
现在,当我首先在另一个选项卡中执行program2(具有空的while循环以保持终止)时,然后运行program1并测量访问时间以读取该数组的所有元素。 令我惊讶的是,与之前只有Program1执行的情况相比,我获得了8000ticks。
看起来只有program1执行时才需要花费更多时间来读取数组,而有2个程序时,program1正在执行与之前相同的任务,而program2通过while循环保持CPU忙。 预计存在program1的访问时间会更长,而实际结果则相反。
为什么会这样?
这是共享库
#include static const int DATA[1024]={1 ,2 ,3,.....1024]; inline void foo(void) { int j, k=0,count=0; for(j=0;j<1024;j++) { k=DATA[j]; } k+=0; }
PROGRAM1
int main(void) { foo(); start=timer(); foo(); end=timer(); printf("Time1=%llun",end-start); start=timer(); foo(); end=timer(); printf("Time2=%llun",end-start); start=timer(); foo(); end=timer(); printf("Time3=%llun",end-start); sleep(1); start=timer(); foo(); end=timer(); printf("after sleep(1)n"); printf("Time4=%llun",end-start); start=timer(); foo(); end=timer(); printf("Time5=%llun",end-start); sleep(2); start=timer(); foo(); end=timer(); printf("after sleep(2)n"); printf("Time6=%llun",end-start); return 0; }
程序2
int main(void) { while(1) {} return 0; }
CASE1(仅运行Program1)
产量
Time1=17918 Time2=17672 Time3=17816 after sleep(1) **Time4= 20716 ** // Is it due to wake up from sleep mode ? Time5=17722 after sleep(2) **Time6=20910** // Is it due to wake up from sleep mode ?
CASE1(程序2先运行,然后程序1开始运行)
产量
Time1 =7483 Time2=7205 Time3=7399 after sleep(1) **Time4= 8734 ** // Is it due to wake up from sleep mode ? Time5=7326 after sleep(2) **Time6=9070** // Is it due to wake up from sleep mode ?
据我所知,当program1单独使用CPU时,读取数组所需的时间必须少于Program1和program2使用CPU时的时间。
我在哪里犯错误? 我有i7机器,只有一个核心,超线程被禁用,ASLR被禁用。
编辑1:
根据Mysticial的建议,我的CPU进入省电模式,而只有program1在那里,所以CPU进入省电模式,然后从省电模式唤醒它需要更长的访问时间。 所以他的建议是多次访问DATA数组。
这是我修改过的共享库。 Program1和Program2没有改变。
#include static const int DATA[1024]={1 ,2 ,3,.....1024]; inline void foo(void) { int j, k=0,count=0; while(count++<10000) { for(j=0;j<1024;j++) { k=DATA[j]; } } k+=0; }
现在输出如下
CASE1(仅运行Program1)
产量
Time1=75186246 Time2=77570299 Time3=80548529 after sleep(1) **Time4= 92608363 ** // Is it due to wake up from sleep mode ? Time5=75616487 after sleep(2) **Time6=97021338** // Is it due to wake up from sleep mode ?
CASE1(程序2先运行,然后程序1开始运行)
产量
Time1 =139337099 Time2=155801957 Time3=146586856 after sleep(1) **Time4= 130558062 ** // Why lower access time after sleep mode ? Time5=145250551 // Time5 is expected lower than Time4 as other run . Why lower here ? after sleep(2) **Time6=130940183** // Again Why lower access time after sleep mode ?
以下是有关修改后的共享库的新问题
我在linux下使用gcc。 任何帮助理解这一点将受到高度赞赏。 提前致谢。
这是我的推测性答案,似乎已在评论中得到证实:
在原始基准测试中,您只运行一次迭代。 因此,基准测试的运行时间不足以“平均”所有随机性。
当您单独运行program1时,它需要将CPU从节能状态唤醒。 这需要时间并且可能导致运行时间更长。
当您同时运行两个程序时(首先从program2开始),program2会提前将CPU从节能状态中取出。 因此,当您运行program1时,不会实现此预热惩罚。
一旦循环基准测试需要更长的时间,这个预热惩罚变得微不足道,你终于看到了代码的预期稳态性能。 (program1本身更快)
以上就是c/c++开发分享与单个进程方案相比,多进程方案中的访问时间意外较低相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/544639.html