使用全局变量与局部变量并需要

时间:2018-07-19 07:31:45

标签: c++ lua

有人告诉我,使用全局变量是不好的,而使用require获取局部变量是更好的设计。

我进行了一个简单的测试,以确定两种方法之间的性能是否存在差异。

我的代码:

#include <lua.hpp>
#include <ctime>
#include <chrono>

void main()
{
    lua_State *L = luaL_newstate();
    luaL_openlibs(L);
    lua_settop(L, 0);
    //Script A
    luaL_dostring(L, "package.preload['A'] = function () local A = {}\n"
                     "function A:mult(a,b) return a * b end\n"
                     "return A end");

    std::clock_t startcputime1 = std::clock();

    //Script B
    for (int i=0; i<100000; ++i)
        luaL_dostring(L, "local A = require 'A' A:mult(2,3)");

    double cpu_duration1 = (std::clock() - startcputime1) / (double)CLOCKS_PER_SEC;
    std::cout << "Finished in " << cpu_duration1 << " seconds [CPU Clock] " << std::endl;
    lua_close(L);


    L = luaL_newstate();
    luaL_openlibs(L);
    lua_settop(L, 0);
    //Script A
    luaL_dostring(L, "A = {} function A:mult(a,b) return a * b end\n");

    std::clock_t startcputime2 = std::clock();

    //Script B
    for (int i=0; i<100000; ++i)
        luaL_dostring(L, "A:mult(2,3)");

    double cpu_duration2 = (std::clock() - startcputime2) / (double)CLOCKS_PER_SEC;
    std::cout << "Finished in " << cpu_duration2 << " seconds [CPU Clock] " << std::endl;
    lua_close(L);
}

结果:

Finished in 0.739236 seconds [CPU Clock] 
Finished in 0.479537 seconds [CPU Clock]

如您所见,使用全局变量A比使用局部变量Arequire更快。

如果性能是我应用程序中的重要因素,这是否意味着最好使用全局变量共享数据?

1 个答案:

答案 0 :(得分:3)

  

如果性能是我应用程序中的重要因素,这是否意味着最好使用全局变量共享数据?

我将忽略我在评论中指出的基准测试问题。我假设您执行了准确的基准测试,并确定全局变量更快。

为使此操作值得一做,您不仅需要证明性能对您的应用很重要,还需要做更多的事情。您必须证明由访问模块局部变量引起的 specific 性能对您的应用很重要。大多数应用程序不会花费大部分时间来访问局部变量。他们的性能问题通常来自算法,他们正在执行的流程,等待硬盘访问或类似性质的事情。

获得建议的目的是确保应用程序中的正确性。通过将模块局部变量保存在自己的表中,可以使一个模块不可能损坏另一个模块。因此,不考虑基于人工测试的建议而又不知道它会显着提高实际应用程序性能的想法。

或者,正如所说的那样,过早的优化是万恶之源。