c++ - 函数执行时间很奇怪

标签 c++ function callstack

我正在尝试评估在这两种情况下在链表中循环与对每个元素进行操作之间的时间差:

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/

相关文章:

java - 如何在 Java 的 Eclipse 调试 View 中过滤调用堆栈

c# - 有没有办法从调用堆栈中获取最后一个表单类?

c++ - 如何理解 std::memory_order (C++) 中的 RELAXED ORDERING

function - 为什么清除传递的表在函数作用域内不起作用?

c++ - 如何使用 Clang 和 MacOSX 提供给定符号

C++ - 使用类名作为函数参数

c++ - 无法在 std::function<> 中传递 std::unique_ptr

c++ - 如何确定 C++ 中详细的调用堆栈信息?

c++ - 标识符和宏有什么区别?

c++ - 仅使用几乎相等的标准(无排序)从容器中删除重复项的最有效方法是什么