运行这个循环要多长时间,咱们是不是要告Intel了?

nwumengfei 2006-12-13 10:58:17
今天女朋友的arm运行速度问题引发了下面这个测试:
她的ARM是三星s3c2410 200MHZ,跑个程序O(n2)n不会超过500,然后就死了,后来知道一直在循环啊!
我就想200MHZ=200*1024*1024HZ 也就是说每秒钟执行200*1024*1024条指令啊!
然后我决定在自己机器上测试一下
代码如下:
#include <afxwin.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
clock_t start,end;
start = clock();
for(int i=0;i<200*1024*1024;i++)
;
end = clock();
printf("Total time %d ms\n",end-start);
return 0;
}

执行时间是惊人的562ms
我的处理器可是2G啊 理论上执行1024*1024*1024才半秒,可是我循环一下测试是夸张的2687ms
兄弟们,大家测一下,然后找Intel索赔去!
...全文
530 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
a_b_c_abc1 2006-12-14
  • 打赏
  • 举报
回复
2G的inter不如我1.6G的AMD

vc6 Debug 927ms
ma100 2006-12-14
  • 打赏
  • 举报
回复
arm和x86体系结构都是不一样的,不具备可比性,前者只能用于工控/嵌入式领域才能体现优势,在比如多媒体,外设的支持上不如x86
rongcanf 2006-12-14
  • 打赏
  • 举报
回复
MARK
HappyTree 2006-12-14
  • 打赏
  • 举报
回复
测试代码如下:
// ThreadTime.h

// This class is for getting the elapsed thread time of the CPU, the unit is ms
// the usage is:
//
// CThreadTime ElapsedTime;
// ElapsedTime.BeginGetElapsedTime();
// TODO: Your performance code
// int nThreadTine = ElapsedTime.EndGetElapsedTime();
//


#include <Windows.h>

class CThreadTime
{
public:
void BeginGetElapsedTime();
__int64 EndGetElapsedTime();

private:
__int64 FileTimeToQuadWord(PFILETIME pft);

private:
FILETIME ftKernelTimeStart;
FILETIME ftKernelTimeEnd;
FILETIME ftUserTimeStart;
FILETIME ftUserTimeEnd;
FILETIME ftDummy;
};

// Get the time elapsed since the thread start
inline void CThreadTime::BeginGetElapsedTime()
{
GetThreadTimes(GetCurrentThread(), &ftDummy, &ftDummy, &ftKernelTimeStart, &ftUserTimeStart);
}

// Calculate the time elapsed
inline __int64 CThreadTime::EndGetElapsedTime()
{
GetThreadTimes(GetCurrentThread(), &ftDummy, &ftDummy, &ftKernelTimeEnd, &ftUserTimeEnd);

__int64 qwKernelTimeElapsed = FileTimeToQuadWord(&ftKernelTimeEnd) - FileTimeToQuadWord(&ftKernelTimeStart);
__int64 qwUserTimeElapsed = FileTimeToQuadWord(&ftUserTimeEnd) - FileTimeToQuadWord(&ftUserTimeStart);

// Get total time duration by adding the kernel and user times.
// the default is 100ns, so we convert it to ms
return (qwKernelTimeElapsed + qwUserTimeElapsed) / 10000;
}

inline __int64 CThreadTime::FileTimeToQuadWord(PFILETIME pft)
{
return (Int64ShllMod32(pft->dwHighDateTime, 32) | pft->dwLowDateTime);
}

// test.cpp
#include <iostream>
#include "ThreadTime.h"

using namespace std;

int main(int argc, char* argv[])
{
CThreadTime time;

time.BeginGetElapsedTime();

for (int i = 0; i < 200 * 1024 * 1024; i++);

cout << time.EndGetElapsedTime() << endl;

return getchar();
}
HappyTree 2006-12-14
  • 打赏
  • 举报
回复
楼主这样统计时间是总的时间,没有考虑到windows是个多任务系统。实际统计的线程占用时间肯定会少很多。我在我的2.8G的cpu上测试了一下,时间在600-800ms左右。因为for循环中循环的语句事实上是有多个操作的。使用的是release版本,但关闭了优化,得到的汇编代码是:
for (int i = 0; i < 200 * 1024 * 1024; i++);
0040187E mov dword ptr [i],0
00401885 jmp main+20h (401890h)
00401887 mov eax,dword ptr [i]
0040188A add eax,1
0040188D mov dword ptr [i],eax
00401890 cmp dword ptr [i],0C800000h
00401897 jge main+2Bh (40189Bh)
00401899 jmp main+17h (401887h)
因此,事实上每次循环需要执行8条指令,实际执行的指令总数是200*8M,即1.6G左右,跟我的cpu运算之后,考虑到统计的误差,基本正常。


wubaojie 2006-12-14
  • 打赏
  • 举报
回复
牛x,哈
洋溢2016 2006-12-14
  • 打赏
  • 举报
回复
在听天语
zzmsl 2006-12-14
  • 打赏
  • 举报
回复
空循环肯定要被release版优化掉的。
neosu 2006-12-13
  • 打赏
  • 举报
回复
release版快的原因是:
这段代码彻底被优化器删掉了.
hai1039 2006-12-13
  • 打赏
  • 举报
回复
晕死,for(int i=0;i<200*1024*1024;i++)每次循环是一条指令吗?
最少是四条指令,如:

00401906 8955CC mov [ebp-0x34],edx
00401909 FF45CC inc dword ptr [ebp-0x34]
0040190C 817DCC0000800C cmp [ebp-0x34],0x0c800000
00401913 7CF4 jl -0x0c


dxlove958 2006-12-13
  • 打赏
  • 举报
回复
mark
nwumengfei 2006-12-13
  • 打赏
  • 举报
回复
楼上的真强 竟然想到release版了 应该不是时间片的问题了 看来是debug版可能加载东西太多了吧
欢迎大家讨论
  • 打赏
  • 举报
回复
贴出来编译器优化过的代码

; COMDAT _main
_TEXT SEGMENT
_maxnum$ = -4
_main PROC NEAR ; COMDAT

; 11 : {

push ecx
push ebx
push esi

; 12 : int num=0;
; 13 : clock_t start,end;
; 14 :
; 15 : int maxnum = 0;
; 16 : scanf("%d",&maxnum);

lea eax, DWORD PTR _maxnum$[esp+12]
push edi
xor edi, edi
push eax
push OFFSET FLAT:??_C@_02MECO@?$CFd?$AA@ ; `string'
mov DWORD PTR _maxnum$[esp+24], edi
call _scanf
add esp, 8

; 17 : start = clock();

call _clock
mov ebx, eax

; 18 : for(int i=0;i<maxnum;i++){

mov eax, DWORD PTR _maxnum$[esp+16]
cmp eax, edi
jle SHORT $L22318
mov edi, eax
$L22318:

; 19 : num++;
; 20 : }
; 21 : end = clock();

call _clock

; 22 : printf("num is=%d\n",num);

push edi
push OFFSET FLAT:??_C@_0L@IFFA@num?5is?$DN?$CFd?6?$AA@ ; `string'
mov esi, eax
call _printf

; 23 : printf("Total time %d ms\n",end-start);

sub esi, ebx
push esi
push OFFSET FLAT:??_C@_0BC@NDLA@Total?5time?5?$CFd?5ms?6?$AA@ ; `string'
call _printf
add esp, 16 ; 00000010H

; 24 :
; 25 : return 0;

xor eax, eax
pop edi
pop esi
pop ebx

; 26 : }

pop ecx
ret 0
_main ENDP
_TEXT ENDS
END
  • 打赏
  • 举报
回复
debug版本3578ms
release 0ms
OpenHero 2006-12-13
  • 打赏
  • 举报
回复
会快一点点,不过不是倍数增长;
不知道这里考虑不考虑OS的影响
毕竟pc里面不只是跑了一个程序~~
烂番 2006-12-13
  • 打赏
  • 举报
回复
你能保证你程序运行期间一直是100%的占用CPU吗?
你能保证你程序运行期间,没有空闭每一个CPU时间片吗?

另外:
for(int i=0;i<200*1024*1024;i++); 貌似对应的汇编指令至少有3条
nwumengfei 2006-12-13
  • 打赏
  • 举报
回复
看来 Clive的 512ms 2556ms 2.93GCPU 和我的2G的差不多啊,都和理论差距甚大不是?
nwumengfei 2006-12-13
  • 打赏
  • 举报
回复
楼上的 这样的话 我的时间只是从原来的2703ms 减少到2687ms啊
#include <afxwin.h>
#include <stdio.h>
const int TIMES = 1024*1024*1024;
int main(int argc, char* argv[])
{
int num=0;
clock_t start,end;
start = clock();

for(int i=0;i<TIMES;i++)
;
end = clock();
printf("Total time %d ms\n",end-start);

return 0;
}
sclarkca810619 2006-12-13
  • 打赏
  • 举报
回复
512ms 2556ms 2.93GCPU
OpenHero 2006-12-13
  • 打赏
  • 举报
回复
因为你每次都运行了乘法运算~~哪就不只是你说的时间了!!!你是运行了
1024*1024*1024 次2个*
加载更多回复(7)

64,654

社区成员

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

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