`

探究数值比较在程序中执行效率的区别

阅读更多

前言:

众所周知,在C语言中,很多函数都会返回-1以表示函数调用出错。但是很多书籍中(如:UNIX环境高级编程

的很多例子并不使用语句

if (fork() == -1) {
    /* 出错处理 */
}

而是使用

if (fork() < 0) {
    /* 出错处理 */
}

今天我们就比较这两种语句,在运算效率上究竟有什么区别。

 

  • 我们来看看"< 0"和"== -1"的执行效率

源代码如下

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/times.h>
#include <unistd.h>

#define TEST_VAL -1
static long clktck = 0; /* 系统每秒时钟滴答数 */

int main(void)
{
    struct tms tmsstart, tmsend;
    clock_t start, end;
    int i, j;
    /* 获取系统每秒时钟滴答数 */
    if ((clktck = sysconf(_SC_CLK_TCK)) < 0) {
        printf("sysconf error: %s\n", strerror(errno));
        exit(0);
    }
    /* 开始时间 */
    printf("val < 0:\n");
    if ((start = times(&tmsstart)) == -1) {
        printf("times error: %s\n", strerror(errno));
        exit(0);
    }

    for (i = 0; i < 100000; i++) {
        if (TEST_VAL < 0) /* 测试条件 */
            ;
        for (j = 0; j < 10000; j++)
            if (TEST_VAL < 0) /* 测试条件 */
               ;
    }
    /* 结束时间 */
    if ((end = times(&tmsend)) == -1) {
        printf("times error: %s\n", strerror(errno));
        exit(0);
    }
    /* 时钟时间 */
    printf("real: %f\n", (end - start) / (double)clktck);
    /* 用户cpu时间 */
    printf("user: %f\n", (tmsend.tms_utime - tmsstart.tms_utime) / (double)clktck);
    exit(0);
}

 

把测试条件分别设为"TEST_VAL < 0"和"TEST_VAL == -1",并分别编译为"t1"和"t2"后运行结果如下图所示


虽然多次运行所消耗的时间略有不同,本人运行多次,然后取平均值后发现,执行"TEST_VAL == -1"所花的时钟时间和用户cpu时间,都略多于"TEST_VAL < 0"

 

  • 我们来观察一下,程序运行的汇编代码

在命令行运行gdb加上-tui选项,进入GDB的TUI模式

 

gdb -tui ./a.out

 

注:要用gdb调试,必须在gcc编译源程序时加上-g选项(如:gcc -g filename)。

 


 

我们都知道,在机器中,机器数的最高有效位为符号位。如果一个数最高有效位为1,则表示该数为负;如果一个数最高有效位为0,则表示该数为正。假设一台机器的int类型字长为8位,那么-1在该机器中将表示为0xff(二进制表示为11111111)。

 

总结:

CMP oprand1,oprand2

通过前面的分析,我们有理由猜想,机器在内部执行cmp指令时,会进行一定程度的优化。 

当测试操作数是否小于0时,机器只检查该操作数的最高有效位是否为1;而当机器在测试操作数是否等于-1时,需要将该操作数与-1逐位相与。这一点区别很可能是造成"TEST_VAL < 0"和"TEST_VAL == -1"执行效率不同的原因。

 

结束语:

以上测试用例可能过于片面,无法反映真实的情况。博主在此抛砖迎玉,如有对此课题感兴趣的读者,可以和博主一起探讨。由于本人水平所限,如有错误,欢迎批评指正。

 

参考文献:

1. http://stackoverflow.com/questions/22380693/what-does-0x4rbp-means-in-gdb-disassembly

2. https://sourceware.org/gdb/onlinedocs/gdb/TUI.html

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

 

  • 大小: 19.1 KB
  • 大小: 8.1 KB
  • 大小: 47.8 KB
  • 大小: 81.5 KB
2
0
分享到:
评论

相关推荐

    探究PLC技术在煤矿机电设备控制中的运用.pdf

    本文将对PLC技术在煤矿机电系统中的应用原理、优势及其具体应用进行深入探究。 一、PLC技术控制原理 1. 采样输入环节 PLC技术的采样输入环节是控制系统运行的基础。在系统运行过程中,CPU会对煤矿作业系统进行全面...

    VC 与MATLAB混合编程技术探究.pdf

    MCC能够将MATLAB代码编译为C或C++库,可以直接在VC++项目中调用,提高了执行效率并增强了程序的移植性。这种方法可以减少对MATLAB运行环境的依赖,同时保留MATLAB的计算优势。 具体实施混合编程时,首先需要在VC++...

    C语言解数学中的各类定 律 、定理、方法、算法源程序.rar )

    在本压缩包“C语言解数学中的各类定律、定理、方法、算法源程序.rar”中,包含了使用C语言实现的数学相关程序,这些程序旨在帮助我们理解和应用数学中的各种定律、定理、方法和算法。C语言是一种强大的编程语言,因...

    A机器人的程序编程.docx

    主程序`main`是程序执行流程的起点,在整个RAPID程序中至关重要,它确保了程序能够按预定流程运行。同时,根据实际应用的需要,程序设计者还可以灵活创建各种类型的模块,如用于主控制的模块、进行位置计算的模块或...

    jiecheng.rar_200的阶乘_阶乘的程序

    标题中的“jiecheng.rar_200的阶乘_阶乘的程序”表明这是一个关于计算200阶乘的程序,可能是一个源代码文件或执行文件。200的阶乘是一个极大的数值,超过了通常整型或浮点型数据类型的表示范围,因此这个程序涉及到...

    matlab nmm tool

    在现代工程领域,特别是在机械、航空航天、土木以及振动工程中,对于复杂系统的理解与预测越来越依赖于先进的数学建模和仿真技术。非线性模态分析作为一项关键技术,它能够帮助工程师和研究人员深入探究系统内部的...

    C语言下迈克耳孙干涉仪测量空气折射率的实验探究.pdf

    实验数据处理中,使用了高精度的计算,这意味着在编写C语言程序时,需要使用双精度浮点数来存储数据,并执行相应的算术运算,以确保最终结果的精度。数据的精确记录和处理,对于实验结果的正确性至关重要。因此,在...

    基于matlab实现的振动计算程序主程序 非线性振动混沌 简单易懂.rar

    程序首先需要将这些方程转换为MATLAB可执行的代码,通过数值方法(如欧拉法、龙格-库塔法)进行求解。 2. **参数设置**:用户可以根据实际问题调整模型参数,如质量、刚度、阻尼系数等,以研究不同参数对系统振动...

    lrd.rar_勒让德_勒让法

    通过应用勒让德多项式,可以构造出一种近似最佳搜索树,这种树在处理大量数据的搜索与排序任务时,能够有效提高执行效率。在解决这类问题时,通常涉及到树形结构的动态调整与优化,利用勒让德多项式可以减少计算...

    微机原理及应用实验报告(20210919170935).pdf

    在这一过程中,学生会接触到诸多实用的命令,如D命令用于显示内存中的内容,E命令允许对内存单元进行编辑,G命令则用于执行程序,而T命令可以实现单步调试,观察程序执行的每个细节。此外,N、U、R、W等命令在查看和...

    efficiency天线口径效率计算.zip

    在上述的"efficiency.m"程序中,Matlab作为强大的数值计算工具,可以执行以下操作: 1. **数据输入**:输入天线的相关参数,如有效辐射面积、天线增益、工作频率等。 2. **计算波长**:基于工作频率计算对应的波长。...

    C语言程序设计:第8章 模块设计.pdf

    - **局部变量与全局变量**:局部变量在函数内部定义,只在该函数中可见,而全局变量在整个程序中都可访问。 - **动态存储变量与静态存储变量**:动态存储变量在栈上分配,生命周期仅限于定义它的函数;静态存储变量...

    基于PLC的自动化控制系统的配置及组态探究.pdf

    扫描过程确保信息在设备间流动畅通,并执行程序语句,保存执行结果。对于输入和输出处理,PLC的映像区接收执行结果,并传递给外部被控设备,整个扫描过程持续进行,直至设备停止。 基于PLC的自动化控制系统遵循从粗...

    常微分方程教学中的Matlab.pdf

    MATLAB具备强大的编程效率和可读性,以及良好的可移植性,对于程序的开发和调试更为便捷,尽管在执行效率上可能不如某些高级编程语言,但这是以提高易用性为代价的。在教学过程中,教师应当注重将MATLAB与课堂理论...

    C 代码 研究正交规则的多项式精确性 在 3D 立方体的内部.rar

    标题中的"C 代码 研究正交规则的多项式精确性 在 3D 立方体的内部"指的是一个使用C或C++编写的程序,其目标是探究在三维立方体空间内,正交规则(Orthogonal Rules)对于多项式计算的精确度。正交规则通常用于数值...

    计算机组成原理课程设计

    软件界面清晰地划分了各项功能区域,例如寄存器、存储器、信息显示等,方便用户实时监控程序执行的状态。 #### 软件使用说明 - **界面说明**:软件系统采用了集成化窗口设计,使得各项功能得以有序排列。具体而言...

    计算机组成原理 移位运算 .ppt

    在计算机组成原理的学习中,移位运算是非常重要的概念,它不仅关系到计算机内部数据的存储和处理效率,还是理解更复杂算法和程序的基础。 移位运算,顾名思义,是将数据在内存中的位模式进行移动,可以将其分为逻辑...

    MATLAB应用探究:从基础到实践.pptx

    此外,MATLAB提供了丰富的内置函数,如数学函数sin和绘图函数plot,以及程序控制结构如for循环和if语句,用于控制程序执行流程。 在数据可视化方面,MATLAB拥有强大的绘图功能。基础绘图函数如plot和scatter用于...

    MM1&MD1代码

    与Java的面向对象实现相比,C语言的代码可能更加注重内存管理和程序的执行效率。C语言实现的MM1和MD1模型可能直接操作内存地址来模拟顾客到达和服务过程。这种底层的实现方式能够提供更精细的控制,有助于对系统性能...

Global site tag (gtag.js) - Google Analytics