搜索
查看: 11663|回复: 34
打印 上一主题 下一主题

小调查:运行计时程序,测试电脑运行速度

[复制链接]
跳转到指定楼层
楼主
发表于 2017-8-8 13:38:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
将以下代码编译运行,屏幕上会输出一个整数(四舍五入后的结果)。
如果把%.0f改成%f,你会发现这个小数每次可能略微有一点差别。不过没关系,四舍五入之后就没事了。

[mw_shl_code=c,false]#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
        int i=1000000000;
        double f;
        f=(double)clock()/CLOCKS_PER_SEC;
        while(i--);
        f=(double)clock()/CLOCKS_PER_SEC-f;
        printf("%.0f",f);
        system("pause>nul");
        return 0;
}
[/mw_shl_code]

也可以在附件中打开。
单选投票, 共有 17 人参与投票 查看投票参与人

投票已经结束

58.82% (10)
5.88% (1)
0.00% (0)
0.00% (0)
0.00% (0)
5.88% (1)
0.00% (0)
11.76% (2)
17.65% (3)
您所在的用户组没有投票权限
沙发
 楼主| 发表于 2017-8-8 13:41:58 | 只看该作者

小调查:运行计时程序,测试电脑运行速度

附件:计时.c
这是将变量i从十亿循环到0。

计时.c

263 Bytes, 下载次数: 24

程序

板凳
 楼主| 发表于 2017-8-8 13:42:51 | 只看该作者
我自己的电脑时间是8秒。
地板
 楼主| 发表于 2017-8-8 13:43:24 | 只看该作者
运行后不要着急,几秒后才会显示结果。
5#
 楼主| 发表于 2017-8-8 14:44:47 | 只看该作者
初学C,你的电脑有那么快?
4499APPLE,我怀疑你是故意捣乱

点评

-100APPLE  发表于 2018-3-11 19:18
“4499APPLE”???  发表于 2018-3-11 18:36
6#
发表于 2017-8-8 14:55:47 | 只看该作者
[mw_shl_code=c,true]#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main()
{
    int i = 0;
    unsigned s = GetTickCount();
    loop:;
    if(1000000000 - (i++)) goto loop;
    printf("%ums",GetTickCount() - s);
    system("@pause > nul");
    return 0;
}[/mw_shl_code]
7#
发表于 2017-8-8 14:58:39 | 只看该作者
上面的代码测得的时间更加准确更加精确:
1.省去了类型转化浪费的时间
2.除去了代价高的除法运算
3.使用效率更高的goto语句代替了while循环
4.直接调用系统api 效率更快
8#
发表于 2017-8-8 15:01:04 | 只看该作者
赵林 发表于 2017-8-8 14:44
初学C,你的电脑有那么快?
4499APPLE,我怀疑你是故意捣乱

是这样子的 我把这个程序放在了windows xp上面运行(XP运行程序的速度你知道的)(加上CPU主频比较高)
9#
发表于 2017-8-8 15:08:09 | 只看该作者
本帖最后由 初学C 于 2017-8-8 15:15 编辑

不过还有一种方法是结果更加精确:使用寄存器变量
[mw_shl_code=c,true]#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main()
{
    register int i = 0;
    register unsigned s = GetTickCount();
    loop:;
    if(1000000000 - (i++)) goto loop;
    printf("%ums",GetTickCount() - s);
    system("@pause > nul");
    return 0;
}[/mw_shl_code]
这段代码我的xp上运行结果是245ms(对不起打错了是545ms)
在我的win8上运行结果是1188ms

10#
 楼主| 发表于 2017-8-8 17:39:04 | 只看该作者
本帖最后由 赵林 于 2017-8-8 17:41 编辑

改成i=1000000000
if(i--)更快
另外设置一个s2,赋值为GetTickCount()-s,最后输出s2这样更好
不过我个人不喜欢用GetTickCount函数,我的电脑用这个容易出问题你等我试验一下
11#
 楼主| 发表于 2017-8-8 17:53:47 | 只看该作者
另外我的Win10运行结果为2814ms,用我的方法改完之后是2598ms,节省了200ms。
但是用goto代替while并用GetTickCount代替clock只能节省100ms。
重要的还是寄存器。
12#
 楼主| 发表于 2017-8-8 18:12:32 | 只看该作者
我在time.h头文件的第101行(我用的是c++的编译器,可能和你的不一样)查到宏定义:
#define CLOCKS_PER_SEC 1000
所以不除以CLOCKS_PER_SEC也行,单位就是ms
13#
 楼主| 发表于 2017-8-8 18:13:50 | 只看该作者
但即使用寄存器变量也无法解决啊哈挑战19啊!我运行了1分钟都不行
14#
发表于 2017-8-8 18:36:28 | 只看该作者
赵林 发表于 2017-8-8 17:53
另外我的Win10运行结果为2814ms,用我的方法改完之后是2598ms,节省了200ms。
但是用goto代替while并用Get ...


这个速度肯定快一些(100000000 - (i++))
15#
 楼主| 发表于 2017-8-8 19:42:16 | 只看该作者
初学C 发表于 2017-8-8 18:36
这个速度肯定快一些(100000000 - (i++))

第九行看不见后面是什么
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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