前言:
众所周知,在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
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关推荐
本文将对PLC技术在煤矿机电系统中的应用原理、优势及其具体应用进行深入探究。 一、PLC技术控制原理 1. 采样输入环节 PLC技术的采样输入环节是控制系统运行的基础。在系统运行过程中,CPU会对煤矿作业系统进行全面...
MCC能够将MATLAB代码编译为C或C++库,可以直接在VC++项目中调用,提高了执行效率并增强了程序的移植性。这种方法可以减少对MATLAB运行环境的依赖,同时保留MATLAB的计算优势。 具体实施混合编程时,首先需要在VC++...
在本压缩包“C语言解数学中的各类定律、定理、方法、算法源程序.rar”中,包含了使用C语言实现的数学相关程序,这些程序旨在帮助我们理解和应用数学中的各种定律、定理、方法和算法。C语言是一种强大的编程语言,因...
标题中的“jiecheng.rar_200的阶乘_阶乘的程序”表明这是一个关于计算200阶乘的程序,可能是一个源代码文件或执行文件。200的阶乘是一个极大的数值,超过了通常整型或浮点型数据类型的表示范围,因此这个程序涉及到...
- 填空题如题目6和7,着重于程序执行过程的模拟,要求学生根据给定的条件推断变量的最终值。 - 题目8和9涉及循环条件和程序终止条件的判断,通过计算得出输出结果。 3. **解答题**: - 解答题如题目10,要求学生...
实验数据处理中,使用了高精度的计算,这意味着在编写C语言程序时,需要使用双精度浮点数来存储数据,并执行相应的算术运算,以确保最终结果的精度。数据的精确记录和处理,对于实验结果的正确性至关重要。因此,在...
程序首先需要将这些方程转换为MATLAB可执行的代码,通过数值方法(如欧拉法、龙格-库塔法)进行求解。 2. **参数设置**:用户可以根据实际问题调整模型参数,如质量、刚度、阻尼系数等,以研究不同参数对系统振动...
在上述的"efficiency.m"程序中,Matlab作为强大的数值计算工具,可以执行以下操作: 1. **数据输入**:输入天线的相关参数,如有效辐射面积、天线增益、工作频率等。 2. **计算波长**:基于工作频率计算对应的波长。...
- **局部变量与全局变量**:局部变量在函数内部定义,只在该函数中可见,而全局变量在整个程序中都可访问。 - **动态存储变量与静态存储变量**:动态存储变量在栈上分配,生命周期仅限于定义它的函数;静态存储变量...
扫描过程确保信息在设备间流动畅通,并执行程序语句,保存执行结果。对于输入和输出处理,PLC的映像区接收执行结果,并传递给外部被控设备,整个扫描过程持续进行,直至设备停止。 基于PLC的自动化控制系统遵循从粗...
MATLAB具备强大的编程效率和可读性,以及良好的可移植性,对于程序的开发和调试更为便捷,尽管在执行效率上可能不如某些高级编程语言,但这是以提高易用性为代价的。在教学过程中,教师应当注重将MATLAB与课堂理论...
标题中的"C 代码 研究正交规则的多项式精确性 在 3D 立方体的内部"指的是一个使用C或C++编写的程序,其目标是探究在三维立方体空间内,正交规则(Orthogonal Rules)对于多项式计算的精确度。正交规则通常用于数值...
软件界面清晰地划分了各项功能区域,例如寄存器、存储器、信息显示等,方便用户实时监控程序执行的状态。 #### 软件使用说明 - **界面说明**:软件系统采用了集成化窗口设计,使得各项功能得以有序排列。具体而言...
此外,MATLAB提供了丰富的内置函数,如数学函数sin和绘图函数plot,以及程序控制结构如for循环和if语句,用于控制程序执行流程。 在数据可视化方面,MATLAB拥有强大的绘图功能。基础绘图函数如plot和scatter用于...
它在数值计算和并行计算领域具有极高的效率和广泛的应用。Fortran的最新标准是Fortran 2018,增加了许多现代编程特性,如面向对象编程、并行处理和错误处理。 Fortran C_tests测试文件是为了验证Fortran程序与C语言...
在3-DOF并联机器人中,反解问题尤为重要,因为它涉及到如何根据所需的末端执行器位置来确定每个关节的角度。 MATLAB作为一种强大的数学计算和编程环境,常被用于解决这类复杂的运动学问题。压缩包中的"matlab程序-...
这种混合编程的模式结合了两种语言的优点,提高了程序的开发效率和执行效率,同时保证了计算的准确性和稳定性。 作者还在文章中提到了杆件长度和截面尺寸对屈曲荷载的影响,并通过软件进行了分析。屈曲荷载是指结构...
在软件开发中,函数是一个重要的概念,它是执行特定任务的代码块,可以接收输入(称为参数或自变量),并返回一个结果(称为返回值)。函数的定义通常包括函数名、参数列表和函数体。函数的使用允许程序员复用代码,...
2. **执行效率低**:作为一种解释型语言,MATLAB在执行复杂计算任务时的速度通常低于编译型语言。 3. **界面开发能力有限**:虽然MATLAB提供了GUI设计工具,但在创建高度定制化的用户界面方面仍然不如专业界面设计...