- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我使用 _rdtsc()
对 atoi()
和 atof()
进行计时,我注意到它们花费了很长时间。因此,我编写了自己的这些函数版本,这些版本比第一次调用要快得多。
我使用的是 Windows 7 VS2012 IDE,但使用的是 Intel C/C++ 编译器 v13。我启用了 -/O3 和 -/Ot (“喜欢快速代码”)。我的 CPU 是 Ivy Bridge(移动)。
经过进一步调查,似乎 atoi()
和 atof()
被调用的次数越多,它们执行得越快??我说的速度更快:
当我从循环外部调用 atoi()
时,仅一次,它需要 5,892 个 CPU 周期,但经过数千次迭代后,这减少到 300 - 600 个 CPU 周期(相当大的执行时间范围)。
atof()
最初需要 20,000 到 30,000 个 CPU 周期,然后在几千次迭代后它需要 18 到 28 个 CPU 周期(这是我的自定义函数第一次使用的速度时间)。
有人能解释一下这个效果吗?
编辑:忘了说-我的程序的基本设置是从文件中解析字节的循环。在循环内部,我显然使用我的 atof 和 atoi 来注意上述内容。但是,我还注意到,当我在循环之前进行调查时,只调用了两次 atoi 和 atof,以及两次用户编写的等效函数,这似乎使循环执行得更快。该循环处理了 150,000 行数据,每行需要 3 个 atof()
或 atoi()
。再一次,我无法理解为什么在我的主循环之前调用这些函数会影响程序调用这些函数 500,000 次的速度?!
#include <ia32intrin.h>
int main(){
//call myatoi() and time it
//call atoi() and time it
//call myatoi() and time it
//call atoi() and time it
char* bytes2 = "45632";
_int64 start2 = _rdtsc();
unsigned int a2 = atoi(bytes2);
_int64 finish2 = _rdtsc();
cout << (finish2 - start2) << " CPU cycles for atoi()" << endl;
//call myatof() and time it
//call atof() and time it
//call myatof() and time it
//call atof() and time it
//Iterate through 150,000 lines, each line about 25 characters.
//The below executes slower if the above debugging is NOT done.
while(i < file_size){
//Loop through my data, call atoi() or atof() 1 or 2 times per line
switch(bytes[i]){
case ' ':
//I have an array of shorts which records the distance from the beginning
//of the line to each of the tokens in the line. In the below switch
//statement offset_to_price and offset_to_qty refer to this array.
case '\n':
switch(message_type){
case 'A':
char* temp = bytes + offset_to_price;
_int64 start = _rdtsc();
price = atof(temp);
_int64 finish = _rdtsc();
cout << (finish - start) << " CPU cycles" << endl;
//Other processing with the tokens
break;
case 'R':
//Get the 4th line token using atoi() as above
char* temp = bytes + offset_to_qty;
_int64 start = _rdtsc();
price = atoi(temp);
_int64 finish = _rdtsc();
cout << (finish - start) << " CPU cycles" << endl;
//Other processing with the tokens
break;
}
break;
}
}
}
文件中的行是这样的(中间没有空行):
34605792 R dacb 100
34605794 A racb S 44.17 100
34605797 R kacb 100
34605799 A sacb S 44.18 100
34605800 R nacb 100
34605800 A tacb B 44.16 100
34605801 R gacb 100
我在“R”消息中的第 4 个元素和“A”消息中的第 5 个元素上使用 atoi()
,并在第 4 个元素上使用 atof()
在“A”消息中。
最佳答案
我猜你为什么看到 atoi
和 atof
有如此大的改进,而不是你自己的更简单的功能,是因为前者有一个大量分支以处理所有边缘情况。前几次,这会导致大量不正确的分支预测,代价高昂。但几次之后,预测变得更加准确。正确预测的分支几乎是免费的,这将使它们与您的不包括开始的分支的简单版本竞争。
缓存当然也很重要,但我认为这不能解释为什么您自己的函数从一开始就很快,并且在重复执行后没有看到任何相关的改进(如果我理解正确的话)。
关于c++ - atoi() 和 atof() 缓存吗?它们似乎执行得越快,调用的次数越多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19334562/
本文关键词:字符串转整数,atoi,题解,Leetcode, 力扣,Python, C++, Java 题目地址:https://leetcode-cn.com/problems/string-to
我正在读取通过 RS485 发送的值,这是编码器的值我首先检查它是否已返回 E 字符(编码器报告错误),如果没有则执行以下操作 *position = atoi( buffer );
我有一个问题,我的 C 程序只为小于 5 的值正确分配了输入数据。我发现在创建保存值的 int 数组时出错:我使用了 atoi(var-1) 而不是 atoi(变种)-1。 当var='5'时,打印出
我试图在字符串 509951644 和 4099516441 上调用 atoi。第一个毫无问题地转换了。第二个是给我十进制值 2,147,483,647 (0x7FFFFFFF)。为什么会这样? 最佳
我编写了一个程序,它从用户那里获取 2 个参数并将它们加在一起,例如,如果用户输入 ./test 12 4,它将打印出总和:16。 令我困惑的是为什么我必须使用 atoi我不能只使用 argv[1]
你好,我有一个函数叫 int SearchKey(char key[]). 我给出的关键是这样的字符串 2014-02-13T23:50:00 在函数中我只保留数字,这意味着我的字符串变成这样:201
我正在制作用于组装的 atoi 函数。 无论我尝试什么都行不通,我也不知道为什么。 有谁知道是什么问题? org 100h mov si, stri ;parameter call atoi
我正在尝试解决家庭作业问题。说明是用 C 语言编写 Vigenere 密码。 C 不喜欢下面的代码: rot = atoi(argv[1][index]) - 'A'; rot 已声明为整数; ind
我试图编写自己的 atoi() 函数实现,并尝试了两种不同的代码: #include #include int myatoi(const char *string); int main(int a
我希望在不使用任何其他函数(如 strtonum())的情况下重现 atoi() 函数的行为。我真的不明白如何将 char 或 char * 转换为 int 而不是将其转换为 ASCII 值。我在 C
我有以下代码: char* input = (char*)malloc(sizeof(char) * BUFFER) // buffer is defined to 100 int digit = a
我想在编译时实现atoi()函数(在C++语言中,使用C++11或C++14标准)。因此它应该能够将双引号中的文本解析为数字,或者报告错误。更具体地说,它是更大系统的一部分,能够在编译时解析类似 pr
以下代码显示了奇怪的行为: int main() { char numArr[] = {'9','8','5'}; int num; printf("%d\n",num);
这是代码: #include /* atoi: convert s to integer; version 2 */ int atoi(char s[]) { int i, n, sign; fo
我在这个简单的循环练习中遇到问题。我认为代码是正确的,并且没有收到任何错误,但是当我运行程序时,我只是一遍又一遍地收到“^C”。请帮忙。 #import #import #include int
我对 atoi() 有一个奇怪的问题:我有一个字符串(比如说 str),类似于“aaaa 1111\0”(我打印并检查过 - 确实是这样)。我尝试在 str+5 上执行 atoi,但程序崩溃了。我在前
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
如何在不使用给定参数中的 atoi 的情况下将字符串转换为整数?这是我尝试过的: int main(int argc, char *argv[]){ for(int i = 1; i < ar
我使用 atoi() 从 header 获取状态代码,但它不适用于以下输入: "404 Not Found\r\n内容类型: text/html\r\n日期: 2013 年 12 月 12 日星期四
printf("Enter a number or type 'Exit' to exit\n"); long val = 0; int y = 3; scanf("%s",
我是一名优秀的程序员,十分优秀!