功能执行时间很奇怪
Function execution time is weird
我正在尝试评估这两种情况下在每个元素上使用操作的链接列表中循环的时间差:
1)在功能内部执行操作
2)在同一地点执行操作而无需函数调用
我期望,由于创建和破坏每个呼叫的stackframe的OS开销,功能调用的变化会更加昂贵,但是我得到的结果恰恰相反。我不明白为什么。有人可以解释发生了什么吗?
这是我的程序:
// 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
修复了这些错误后,我的第二个数字的值始终低于第一个数字。
您正在以不同单位进行测量时间: std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin)
vs std::chrono::duration_cast<std::chrono::microseconds>(end - begin)
。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 简单C++"Hello World"程序的执行时间长
- 我使用 OpenMP 的线程越多,执行时间就越长,这是怎么回事?
- 为什么切换 for 循环的顺序会显著改变执行时间?
- 控制台打印时间功能产生1
- cmd.exe与Powershell中C++程序的不同执行时间
- pthread执行时间比顺序执行时间差
- OpenCV 函数 cv::remap() 的执行时间更长,当程序在两者之间进入睡眠状态时
- 为什么 std::chrono 在测量循环和编译器优化的并行 OpenMP 的执行时间时不起作用?
- 我需要帮助来缩短检索 SSL 证书的执行时间
- 当再次触发信号时,从Qt插槽执行的功能被第二次调用时会发生什么?
- 如何测量cudaMalloc执行时间
- c++中的执行时间和检查流状态
- 为什么for循环中的异步不能提高执行时间
- 为什么 C++ openMP 程序执行时间更长
- 测量任何 Windows 可执行文件的内存使用情况和执行时间
- 功能执行时间很奇怪
- 在Visual Studio Enterprise 2017(C )中测量功能执行时间
- 如果执行时间过长,我可以中断功能吗?
- 使用 <Windows.h> 暂停时间并继续执行其他功能的函数