我正在尝试评估在这两种情况下在链表中循环与对每个元素进行操作之间的时间差:
1) 在函数内部进行操作
2) 在同一个地方没有函数调用的情况下进行操作
由于为每次调用创建和销毁堆栈框架的操作系统开销,我预计函数调用的变化会更加昂贵,但我得到的结果恰恰相反。我不明白为什么。有人可以解释一下发生了什么吗?
这是我的程序:
// ConsoleApplication4.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include<iostream>
#include<chrono>
#include<stdlib.h>
#define _CRT_SECURE_NO_WARNINGS
class linked_list_node
{
int a;
public :
std::string var;
bool eval()
{
if (var == "abc")
return true;
return false;
}
linked_list_node() { a = rand() % 100; if (a % 2 == 0) var = "abc"; }
linked_list_node* nxt;
std::string getVar() { return var; }
linked_list_node* getNext()
{
return nxt;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
linked_list_node *head = new linked_list_node();
linked_list_node *trav = head;
int len = 75000;
while (len != 0)
{
linked_list_node *n = new linked_list_node();
trav->nxt = n;
trav = n;
len--;
}
trav->nxt = NULL;
//traversal with function
int length = 0;
trav = head;
std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
while (trav != NULL)
{
length++;
if (trav->eval())
std::cout << "";
trav = trav->nxt;
}
std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
std::cout << "Time difference with function == " << std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count() << std::endl;
//traversal without function
trav = head;
length = 0;
begin = std::chrono::steady_clock::now();
while (trav != NULL)
{
length++;
if (trav->var =="abc")
std::cout << "";
trav = trav->nxt;
}
end = std::chrono::steady_clock::now();
std::cout << "Time difference without function = " << std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count() << std::endl;
getchar();
return 0;
}
这些是我的结果:
与函数的时间差== 18100
无功能时差= 33700000
最佳答案
第一个区别:
在函数中,您将 var
的值与 "abc"
进行比较。
在非函数调用代码中,您将 var
的值与 "ram"
进行比较。
第二个区别,最重要的一个:
在第一种情况下,您使用的是 std::chrono::microseconds
。
在第二种情况下,您使用的是 std::chrono::nanoseconds
在我修复这些错误后,我得到的第二个数字的值始终低于第一个数字。
关于c++ - 函数执行时间很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42732590/