当前位置: 首页 > 面试题库 >

使用类变量或局部函数变量是否更好/更快?

胡星汉
2023-03-14
问题内容

好的,我知道标题不能完全解释这个问题。因此,我正在编写一个执行大量计算的程序,并尝试对其进行优化,以使其运行不会太慢。我有一个函数,该函数是一个类的成员,该函数被调用约500万次。这是功能:

void PointCamera::GetRay(float x, float y, Ray& out)
{
    //Find difference between location on view plane and origin and normalize
    float vpPointx = pixelSizex * (x - 0.5f * (float)width);
    float vpPointy = pixelSizey * (((float)height - y) - 0.5f * height);

    //Transform ray to camera's direction
    out.d = u * vpPointx + v * vpPointy - w * lens_distance;
    out.d.Normalize();

    //Set origin to camera location
    out.o = loc;
}

我想知道在类中声明变量vpPointx和vpPointy是否比每次调用函数时声明它们更好/更快。这将是一个很好的优化还是效果不大?

通常,如果这里有任何可以优化的内容,请告诉我。


问题答案:

通过限制变量的范围,您为编译器优化器提供了更多机会来重新排列代码并使其运行更快。例如,它可以将那些变量的值完全保留在CPU寄存器中,这可能比内存访问快一个数量级。另外,如果这些变量是类实例变量,则编译器将不得不在this每次访问它们时生成代码以解除引用,这很可能会比局部变量访问慢。

与往常一样,您应该自己衡量性能,并尝试两种方式的代码(或更好的方式,尽可能多地尝试一下)。所有优化建议都取决于编译器实际执行的操作,这需要进行实验。



 类似资料:
  • 问题内容: 我一直在寻找一些Java基本集合(的宝库,fastutil,HPPC)和我已经注意到,类变量有时声明为图案的局部变量。例如: 我已经进行了一些基准测试,看来这样做时速度 稍 快,但是为什么会这样呢?我试图了解如果注释掉函数的前三行,那么Java将有何不同之处。 注意:这似乎与此问题相似,但这是针对c ++的,并且没有解决为什么声明它们的原因。 问题答案: 此处的关键字是红色鲱鱼。之所以

  • 当你在函数定义内声明变量的时候,它们与函数外具有相同名称的其他变量没有任何关系,即变量名称对于函数来说是 局部 的。这称为变量的 作用域 。所有变量的作用域是它们被定义的块,从它们的名称被定义的那点开始。 使用局部变量 例7.3 使用局部变量 #!/usr/bin/python # Filename: func_local.py deffunc(x):     print'x is', x    

  • 问题内容: 我刚刚创建了angularJS应用程序。 这是我的 index.html app.js 我有login.html,register.html和forgotpassword.html,home.html。每个人在单独的文件中都有单独的控制器。login.js,register.js,forgot.js,home.js。 login.js 同样,我在其他控制器中也有post方法。 我想要的

  • 问题内容: 我正在使用函数,这样我的程序就不会一团糟,但我不知道如何将局部变量变成全局变量。 问题答案: 这是两种实现相同目的的方法: 使用参数并返回(推荐) 运行时,将获得以下输出 使用全局变量(永远不要这样做) 现在您将获得:

  • 问题内容: 你会怎么做? 或这个 : 最重要的是,我想知道何时在本地变量中存储值更有效,何时进行函数调用更好。 问题答案: 更具可读性更有效。临时表达式和局部变量需要相同的空间,从CPU / JVM的角度看,它们并没有太大区别。JVM将在优化/内嵌方面做得更好。 但是,如果方法调用很昂贵,则将其 缓存 在局部变量中。如果这只是一个简单的方法,无论如何都会内联。你的具体情况也恕我直言,局部变量 是

  • 怎样使一个变量变成“局部”变量? 局部变量 如果变量用local来声明,那么它就只能够在该变量被声明的代码块中可见。 这个代码块就是局部范围。 在一个函数中,一个局部变量只有在函数代码中才有意义.[1] 例子 24-12. 局部变量的可见范围 #!/bin/bash # ex62.sh: 函数内部的局部变量与全局变量。 func () { local loc_var=23 #