功能执行时间很奇怪

Function execution time is weird

本文关键字:执行时间 功能      更新时间:2023-10-16

我正在尝试评估这两种情况下在每个元素上使用操作的链接列表中循环的时间差:

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)