搜索
查看: 864|回复: 13
打印 上一主题 下一主题

如何使i++;这行代码执行精确的10秒钟时间

[复制链接]
跳转到指定楼层
楼主
发表于 2014-7-19 21:46:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5啊哈币
我的目的是看看电脑在十秒钟内能够从1加到几。
代码如下:
int i;
i++;
printf("%d");
但这样i的值会一直加上去,如何让它只运行10秒?Sleep()用不上啊

最佳答案

查看完整内容

difftime(time(0), tm)这句比起i++耗时多太多 两个function call,而且time还要做system call 和修改自己虚拟空间里一个变量的值比起来消耗太大
沙发
发表于 2014-7-19 21:46:10 | 只看该作者
981013 发表于 2014-7-23 21:04
完整代码应该是这样
[mw_shl_code=c,true]#include
#include

difftime(time(0), tm)这句比起i++耗时多太多
两个function call,而且time还要做system call
和修改自己虚拟空间里一个变量的值比起来消耗太大
板凳
发表于 2014-7-19 22:33:45 | 只看该作者
用个线程或者进程
去研究研究winapi吧

或者自己掐表
或者用调试器之类的
地板
发表于 2014-7-19 23:16:54 来自手机 | 只看该作者
获取系统时间,每次加完1就获取一下,一直到最后一次减第一次等于10秒就停止相加!一般10秒后就是一个相当大的数了,你必须用long int
5#
发表于 2014-7-19 23:35:56 | 只看该作者
xchief 发表于 2014-7-19 23:16
获取系统时间,每次加完1就获取一下,一直到最后一次减第一次等于10秒就停止相加!一般10秒后就是一个相当 ...

现在一般环境上long int和int的范围一样
6#
发表于 2014-7-23 21:00:07 | 只看该作者
这段循环可以较为精确地控制运行时间为10秒,但缺点是会占满CPU,对运行结果有一定影响
[mw_shl_code=c,true]//需要#include <time.h>
time_t tm=time(0);
for(int a=0;;a++)//需要在C99环境下编译,也可先声明a
{
    if(difftime(time(0),tm)>=10)
         break;
}[/mw_shl_code]
7#
发表于 2014-7-23 21:04:53 | 只看该作者
完整代码应该是这样
[mw_shl_code=c,true]#include <time.h>
#include <stdio.h>
int main()
{
time_t tm=time(0);
int a;
for(a=0;;++a)
{
    if(difftime(time(0),tm)>=10)
        break;
}
    printf("%d",a);
}[/mw_shl_code]
8#
发表于 2014-7-23 21:52:50 | 只看该作者
981013 发表于 2014-7-23 21:00
这段循环可以较为精确地控制运行时间为10秒,但缺点是会占满CPU,对运行结果有一定影响
[mw_shl_code=c,tru ...

你直接写for(;;)或者while(1)不就好了吗
9#
 楼主| 发表于 2014-8-4 23:25:04 | 只看该作者
981013 发表于 2014-7-23 21:04
完整代码应该是这样
[mw_shl_code=c,true]#include
#include

我试了几次耶,每次不一样,都在70000000左右,不是很大,看来时间判断对运行确实有较大影响。但比较不同电脑的加法运算速度够用了。
10#
发表于 2014-8-4 23:34:50 | 只看该作者
福华 发表于 2014-8-4 23:25
我试了几次耶,每次不一样,都在70000000左右,不是很大,看来时间判断对运行确实有较大影响。但比较不同 ...

我觉得,10s最先要考虑的就是上面有人说过的溢出
建议你先跑0.1秒看看
11#
发表于 2014-8-31 01:49:42 | 只看该作者
本帖最后由 rosynirvana 于 2014-8-31 02:02 编辑

今天又想起这个问题,应该做的是做十万次加法然后看流逝的时间,而不是控制时间来看跑多少次加法
时间可以用windows的一些API精确计量

  1. #include <windows.h>
  2. #include <stdio.h>

  3. int main()
  4. {
  5.         long long start, end, diff;
  6.         long long freq;
  7.         int i;

  8.         QueryPerformanceFrequency(&freq);
  9.         QueryPerformanceCounter(&start);
  10.         for(i=0; i<100000; ++i)
  11.                 ;
  12.         QueryPerformanceCounter(&end);
  13.         diff = end - start;


  14.         diff *= 1000000;
  15.         diff /= freq;

  16.         printf("%I64d\n", diff);

  17.         return 0;
  18. }
复制代码


输出的是10万次++i用的时间,单位是微秒
在我这里系统cpu占用很高时0.9ms,空闲时0.2ms
12#
发表于 2014-8-31 02:10:55 | 只看该作者
正式点的写法要用windows定义的LARGE_INTEGER union
  1. #include <windows.h>
  2. #include <stdio.h>

  3. int main()
  4. {
  5.         LARGE_INTEGER start, end, diff;
  6.         LARGE_INTEGER freq;
  7.         int i;
  8.         int j;
  9.         long long sum = 0;

  10.         for(j=0; j!=10; ++j){
  11.                 QueryPerformanceFrequency(&freq);
  12.                 QueryPerformanceCounter(&start);
  13.                 for(i=0; i<100000; ++i)
  14.                         ;
  15.                 QueryPerformanceCounter(&end);
  16.                 diff.QuadPart = end.QuadPart - start.QuadPart;
  17.                 diff.QuadPart *= 1000000;
  18.                 diff.QuadPart /= freq.QuadPart;

  19.                 printf("%I64d ", diff.QuadPart);

  20.                 sum += diff.QuadPart;
  21.         }

  22.         printf("\n%I64d\n", sum /= 10);
  23.         return 0;
  24. }
复制代码


然后加上统计10次求平均的代码
13#
 楼主| 发表于 2014-10-1 12:22:29 | 只看该作者
感谢提供又一种思路,这样会简单些
14#
发表于 2014-10-5 09:21:15 | 只看该作者
演示一下用线程的写法

主线程创建一个子线程,子线程一直让共用的count加一
主线程等待若干时间后然后挂起子进程,再输出count

  1. #include <Windows.h>
  2. #include <stdio.h>

  3. int count;
  4. DWORD WINAPI ThreadProc(LPVOID para)
  5. {
  6.         while(1)
  7.                 count += 1;
  8. }

  9. int main()
  10. {
  11.         HANDLE thread_handle;
  12.         thread_handle = CreateThread(NULL,
  13.                 0, ThreadProc, NULL, 0, NULL);
  14.         WaitForSingleObject(thread_handle, 5);
  15.         SuspendThread(thread_handle);

  16.         printf("%d\n", count);
  17.         Sleep(4000);
  18.         return 0;
  19. }
复制代码


这种做法不可靠,因为线程调度完全交给操作系统内核的,有可能主线程等了一段时间才切换到子线程。
把等待时间改成1可以发现有时候输出结果是0,说明完全没切换到子线程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表