大神看看为什么性能相差那么多

ming_311 2018-07-30 09:19:32
execute函数是模拟循环60000000次耗时814毫秒,execute2函数是直接循环60000000次耗时162毫秒,两个函数体的语句一致,为什么性能相差那么多?





#include<stdio.h>
#include<windows.h>
int mm[2];
void execute(int ins[], int size){

mm[0] = 1;
for(int i = 0; i< size;i++){
switch(ins[i]){

case 1 :

++mm[0];
break;
case 2:

mm[1] = mm[0];
break;
case 3:

mm[1] = mm[1] < 60000000;
break;
case 4:

if(!mm[1]){
i = 100;
}
break;
case 5:

if(mm[1]){
i = 0;
}
break;
}
}

}
void execute2(){
for(int i = 0; i < 60000000; i++){
switch( i % 5){
case 0: mm[0]++; break;
case 1: if(mm[0]){;} break;
case 2: if(!mm[0]){;} break;
case 3: mm[1] = mm[1] < 60000000;break;
case 4: mm[1] = mm[0]; break;
}
}
}

int getms(){
SYSTEMTIME time;
GetSystemTime(&time);

return time.wMinute * 60 * 1000 + time.wSecond * 1000 + time.wMilliseconds;
}
int main(int argc,char** argv){

int ins[6];
ins[0] = 2;
ins[1] = 2;
ins[2] = 3;
ins[3] = 4;
ins[4] = 1;
ins[5] = 5;

int s = getms();
execute(ins, 6);
printf("耗时%d毫秒\n",getms() - s);
s = getms();
execute2();
printf("耗时%d毫秒\n",getms() - s);

return 0;
}

...全文
187 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mr。Lili 2018-07-30
  • 打赏
  • 举报
回复
引用 10 楼 ming_311 的回复:
[quote=引用 9 楼 xyqdz 的回复:]
上边是我的测试代码

怎么实现一个模拟循环来接近真实的循环呢?[/quote]
https://blog.csdn.net/a1414345/article/details/53957950
你可以参考下
ming_311 2018-07-30
  • 打赏
  • 举报
回复
引用 9 楼 xyqdz 的回复:
上边是我的测试代码

怎么实现一个模拟循环来接近真实的循环呢?
Mr。Lili 2018-07-30
  • 打赏
  • 举报
回复
上边是我的测试代码
Mr。Lili 2018-07-30
  • 打赏
  • 举报
回复
#include<stdio.h> 
#include<windows.h>
#include <iostream>

int mm[2];
void execute(int ins[], int size){

mm[0] = 1;
int n = 0;
for(int i = 0; i< size;i++){
++n;
switch(ins[i]){
case 1 :

++mm[0];
break;
case 2:

mm[1] = mm[0];
break;
case 3:

mm[1] = mm[1] < 60000000;
break;
case 4:

if(!mm[1]){
i = 100;
}
break;
case 5:

if(mm[1]){
i = 0;
}
break;
}
}

std::cout << "execute 循环次数:"<< n << std::endl;

}
void execute2(){
int i = 0;
for(i = 0; i < 60000000; i++){
switch( i % 5){
case 0: mm[0]++; break;
case 1: if(mm[0]){;} break;
case 2: if(!mm[0]){;} break;
case 3: mm[1] = mm[1] < 60000000;break;
case 4: mm[1] = mm[0]; break;
}
}
std::cout << "execute2 循环次数:"<< i << std::endl;
}

int getms(){
SYSTEMTIME time;
GetSystemTime(&time);

return time.wMinute * 60 * 1000 + time.wSecond * 1000 + time.wMilliseconds;
}
int main(int argc,char** argv){

int ins[6];
ins[0] = 2;
ins[1] = 2;
ins[2] = 3;
ins[3] = 4;
ins[4] = 1;
ins[5] = 5;

int s = getms();
execute(ins, 6);
printf("耗时%d毫秒\n",getms() - s);
s = getms();
execute2();
printf("耗时%d毫秒\n",getms() - s);

int nTest = 0;
std::cin >> nTest;
return 0;
}

Mr。Lili 2018-07-30
  • 打赏
  • 举报
回复
循环次数不是一样的。
execute 循环次数:299999999
耗时384毫秒
execute2 循环次数:60000000
耗时77毫秒
ming_311 2018-07-30
  • 打赏
  • 举报
回复
引用 5 楼 DelphiGuy 的回复:
你的两段代码并不等效,execute()在循环内部修改了循环变量i,实际循环执行次数远多于60000000。


是的。怎么实现一个模拟循环来接近真实的循环呢?
  • 打赏
  • 举报
回复
你的两段代码并不等效,execute()在循环内部修改了循环变量i,实际循环执行次数远多于60000000。
kbasm 2018-07-30
  • 打赏
  • 举报
回复
你看看编译的汇编代码就知道了。2能优化掉两个case,1有多个条件跳转扰乱了流水线优化。
ming_311 2018-07-30
  • 打赏
  • 举报
回复
引用 1 楼 qq_26664187 的回复:
也许是写在同一行里 程序运行地更快吧

代码排版的问题,应该没什么影响吧?
关键看代码执行的语句次数,即时间复杂度
Votangroom 2018-07-30
  • 打赏
  • 举报
回复
也许是写在同一行里 程序运行地更快吧

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧