首页 > 解决方案 > 使用全局变量与局部变量并要求

问题描述

有人告诉我,使用全局变量不好,使用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.

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

标签: c++lua

解决方案


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

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

为了让这件事变得有价值,您需要做的不仅仅是证明性能对您的应用程序很重要。您必须证明访问模块局部变量所导致的特定性能对您的应用程序很重要。大多数应用程序不会花费大部分时间访问局部变量。它们的性能问题通常来自算法、它们正在执行的进程、等待硬盘访问或类似性质的事情。

向您提供建议的目的是确保您的申请正确无误。通过将模块局部变量保存在它们自己的表中,您可以使一个模块无法损坏另一个模块。因此,在不知道它会显着提高您的实际应用程序性能的情况下,忽略基于人工测试的建议是不明智的。

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


推荐阅读