优化内存代码¶
由于内存读取的开销很高,在编写内存读取的代码时,优化极其重要。在前面的代码片段中,注意 findString() 函数没有使用 Lua 引擎内置的 readString() 函数。相反,它读取大块内存并在本地搜索目标字符串。让我们来分解一下数字。
使用 readString() 的扫描会尝试在每个可能的内存地址读取长度为 len 的字符串。这意味着它最多会读取 (0x2FFFFFF * len+ len) 字节。然而,findString() 读取 4096 字节的块并在本地扫描匹配字符串。这意味着它最多会读取 (0x2FFFFFF + 4096 +(0x2FFFFFF / (4096 - 10)) * len) 字节。当搜索长度为 10 的字符串时,两种方法读取的字节数分别为 503,316,480 和 50,458,923。
findString() 不仅读取的数据量少一个数量级,它调用的内存读取次数也少得多。以 4096 字节为块读取总共需要(0x2FFFFFF / (4096 - len)) 次读取。相比之下,使用 readString()的扫描需要 0x2FFFFFF 次读取。使用 findString() 的扫描是巨大的改进,因为调用一次读取比增加读取的数据量昂贵得多。(注意,我随意选择了 4096。我把块保持相对较小,因为读取内存可能很耗时,一次读取四个页面只是为了找到字符串可能很浪费。)