c++ - 使用全局变量与局部变量并要求
问题描述
有人告诉我,使用全局变量不好,使用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
比使用局部变量A
和require
.
如果性能是我的应用程序中的重要因素,这是否意味着使用全局变量来共享数据会更好?
解决方案
如果性能是我的应用程序中的重要因素,这是否意味着使用全局变量来共享数据会更好?
我将忽略我在评论中指出的基准问题。我假设您执行了准确的基准测试并确定全局变量更快。
为了让这件事变得有价值,您需要做的不仅仅是证明性能对您的应用程序很重要。您必须证明访问模块局部变量所导致的特定性能对您的应用程序很重要。大多数应用程序不会花费大部分时间访问局部变量。它们的性能问题通常来自算法、它们正在执行的进程、等待硬盘访问或类似性质的事情。
向您提供建议的目的是确保您的申请正确无误。通过将模块局部变量保存在它们自己的表中,您可以使一个模块无法损坏另一个模块。因此,在不知道它会显着提高您的实际应用程序性能的情况下,忽略基于人工测试的建议是不明智的。
或者,正如人们所说,过早的优化是万恶之源。
推荐阅读
- java - org.springframework.util.ReflectionUtils 在 Spring boot 2.2.5.RELEASE 上的非法反射访问,spring data mongodb 在 jdk15 上运行
- python - 无法使用 pyodbc 和 SQLAlchemy 通过 Python 连接到 MySQL
- angular - 在 localhost 上托管一个 Angular 项目并允许从不同的网络访问?
- laravel - 从相同的距离和坐标搜索谷歌地图距离返回多个纬度和经度显示在相同的位置
- firebase - Android Studio - Firestore WatchStream - 如何从 WatchStream 对象收集状态码
- php - 包含关联数组的数组的正确 PHP 语法
- c# - C#:应用程序在 SystemTray 中带有 NotifyIcon -> 无法添加上下文菜单
- c# - 包含链式 HTTP 请求的 ASP.NET C# WebApi 的性能问题
- html - Webpack、jinja 模板和静态路径
- python - 无法解密python中的数据来自Angular的加密数据