C++ 缓存位置与函数调用

C++ 缓存位置与函数调用,c++,caching,architecture,C++,Caching,Architecture,我有一个执行任务的函数,让我们调用这个函数F()。现在,我需要在足够小的时间内完成这个任务。我可以考虑做两件事: //这里的代码。。。 功能代码-F() 功能代码-F() . . . 功能代码-F() //以下代码 //这里的代码 对于(inti=0;i当问题是哪种代码更快时,没有一个适合所有人的答案。你必须测量它 但是,您心目中的优化(循环展开和函数内联)是编译器真正擅长的技术。很少在代码中显式应用它们可以帮助编译器执行更好的优化。我宁愿担心编写不必要的聪明代码来防止编译器优化 如果你有一个

我有一个执行任务的函数,让我们调用这个函数
F()
。现在,我需要在足够小的时间内完成这个任务。我可以考虑做两件事:

  • //这里的代码。。。
    功能代码-F()
    功能代码-F()
    .
    .
    .
    功能代码-F()
    //以下代码
    

  • //这里的代码
    
    对于(inti=0;i当问题是哪种代码更快时,没有一个适合所有人的答案。你必须测量它

    但是,您心目中的优化(循环展开和函数内联)是编译器真正擅长的技术。很少在代码中显式应用它们可以帮助编译器执行更好的优化。我宁愿担心编写不必要的聪明代码来防止编译器优化

    如果你有一个具体的例子,我建议你看一看。这是一个很好的工具,可以帮助你看到代码变化对编译器输出的影响

    也不要忘记D.克努特的名言:

    程序员浪费大量的时间思考或担心 关于,他们程序中非关键部分的速度 在以下情况下,提高效率的尝试实际上会产生强烈的负面影响: 考虑调试和维护。我们应该忘记小问题 效率,比如说97%的时间:过早优化是关键 万恶之源。然而,我们不应该在这方面放弃我们的机会 临界3%

    通常情况下,它是不完整的,而最后一部分与其他部分一样重要:“但我们不应该错过这关键的3%的机会。”。要知道这3%在哪里,您必须分析您的代码


    TL;DR:不要过早地进行优化。首先测量和分析,只有这样你才能知道哪些地方值得改进,以及是否可以得到改进。

    当问题是哪种代码更快时,没有一个适合所有人的答案。你必须测量它

    但是,您心目中的优化(循环展开和函数内联)是编译器真正擅长的技术。很少在代码中显式应用它们可以帮助编译器执行更好的优化。我宁愿担心编写不必要的聪明代码来防止编译器优化

    如果你有一个具体的例子,我建议你看一看。这是一个很好的工具,可以帮助你看到代码变化对编译器输出的影响

    也不要忘记D.克努特的名言:

    程序员浪费大量的时间思考或担心 关于,他们程序中非关键部分的速度 在以下情况下,提高效率的尝试实际上会产生强烈的负面影响: 考虑调试和维护。我们应该忘记小问题 效率,比如说97%的时间:过早优化是关键 万恶之源。然而,我们不应该在这方面放弃我们的机会 临界3%

    通常情况下,它是不完整的,而最后一部分与其他部分一样重要:“但我们不应该错过这关键的3%的机会。”。要知道这3%在哪里,您必须分析您的代码


    TL;DR:不要过早地进行优化。首先测量和分析,只有这样你才能知道哪里值得改进,以及是否可以得到改进。

    编译器可以自行展开循环。专注于编写可读代码,而不是试图智取编译器。算法更改通常比执行更重要到目前为止,调用或不调用函数的影响。无论如何,如果你想知道,你必须测量。顺便说一句,我不理解你的推理。“在第一种情况下,我避免了函数调用的开销”函数调用在两种情况下都是相同的,不是吗?@formerlyknownas_463035818我的意思是,在第一种情况下,我自己内联函数,而不是等待编译器来完成。这样,我就复制了代码,这将导致更差的缓存位置,并避免函数开销。@gundechaHills这不是您在无论如何,在决定什么是内联的和什么不是内联的方面,编译器比你(可能是99%的其他人)更聪明编译器可以自行展开循环。专注于编写可读代码,而不是试图智胜编译器。算法更改通常远远超过调用或不调用函数对性能的影响。无论如何,如果你想知道,你必须衡量。顺便说一句,我不理解你的推理。“在第一种情况下,我避免了函数调用开销"函数调用在两种情况下都是相同的,不是吗?@formerlyknownas_463035818我的意思是,在第一种情况下,我自己内联函数,而不是等待编译器来完成。这样,我就复制了代码,这将导致更差的缓存位置,并避免函数开销。@gundechaHills这不是您在无论如何,在决定什么是内联的和什么不是内联的方面,编译器比你(可能是99%的其他人)更聪明