Lua性能优化技巧(四):关于字符串_Lua

与表类似,了解Lua如何实现字符串可以让你更高效地使用它。

Lua实现字符串的方式与多数其他脚本语言所采用的两种主要方式都不相同。首先,Lua中的所有字符串都是内部化[1]的,这意味着Lua维护着任何字符串的一个单一拷贝。当一个新字符串出现时,Lua检查是否有现成的拷贝,如果有的话,重用之。内部化使得诸如字符串对比和索引表之类的操作非常快速,但是会降低创建字符串的速度。

第二,Lua中的变量从不存储字符串,只是引用它们。这种实现方式可以加快很多字符串操作,例如在Perl中,当你写类似于$x=$y的代码、$y是一个字符串时,赋值操作会将字符串的内容从$y的缓冲区复制到$x的缓冲区。如果这个字符串很长,这个操作的开销就很大。而在Lua中,这个赋值仅仅是一次指针的复制。

然而,这种引用实现会降低特定方式的字符串连接的速度。在Perl中,操作$s = $s . "x"和$s .= "x"区别非常大,对于前者,你获得了$s的一个拷贝,并且追加"x"到它的尾部;而对于后者,"x"只是简单地被追加到$s所维护的内部缓冲区的尾部。因此,后者无关于字符串的长度(假设缓冲区足够放下追加的文本)。如果把这两句代码放进循环里,它们的区别就是线性和二次算法的区别。例如,下述循环需要大约五分钟来读取一个5MB的文件:

复制代码 代码如下:

$x = "";
while (<>)
{
    $x = $x . $_;
}

如果我们把

复制代码 代码如下:

$x = $x . $_

改为

复制代码 代码如下:

$x .= $_

耗时将会降低为0.1秒!

Lua没有提供第二种,也就是更快速的方式,因为它的变量没有内部缓冲区。因此,我们需要一个显式的缓冲区:一个包含字符串片段的表来完成这项工作。下面的循环读取相同的5MB的文件,需要0.28秒,虽然没有Perl那么快,也还算不错:

复制代码 代码如下:

local t = {}
for line in io.lines() do
    t[#t + 1] = line
end
s = table.concat(t, "\n")

[1] 内部化,原文internalize

时间: 2024-10-08 18:01:44

Lua性能优化技巧(四):关于字符串_Lua的相关文章

Lua性能优化技巧(一):前言_Lua

和在所有其他编程语言中一样,在Lua中,我们依然应当遵循下述两条有关程序优化的箴言: 原则1:不要做优化. 原则2:暂时不要做优化(对专家而言). 这两条原则对于Lua编程来说尤其有意义,Lua正是因其性能而在脚本语言中鹤立鸡群. 当然,我们都知道性能是编程中要考量的一个重要因素,指数级时间复杂度的算法会被认为是棘手的问题,绝非偶然.如果计算结果来得太迟,它就是无用的结果.因此,每一个优秀的程序员都应该时刻平衡在优化代码时所花费的资源和执行代码时所节省的资源. 优秀的程序员对于代码优化要提出的第

Lua性能优化技巧(五):削减、重用和回收_Lua

当处理Lua资源时,我们也应该遵循提倡用于地球资源的3R原则--Reduce, Reuse and Recycle,即削减.重用和回收. 削减是最简单的方式.有很多方法可以避免使用新的对象,例如,如果你的程序使用了太多的表,可以考虑改变数据的表述形式.一个最简单的例子,假设你的程序需要操作折线,最自然的表述形式是: 复制代码 代码如下: polyline = {     { x = 10.3, y = 98.5 },     { x = 10.3, y = 18.3 },     { x = 1

jQuery性能优化技巧分析

 这篇文章主要介绍了jQuery性能优化技巧,较为详细的分析了jQuery的常见使用技巧,非常具有实用价值,需要的朋友可以参考下     本文较为详细分析了jQuery性能优化技巧.分享给大家供大家参考.具体分析如下: 一.使用最新版本的jQuery类库 jQuery新版本会较上个版本进行Bug修复和一些优化,不过需要注意的是,在更换版本之后,不要忘记测试你的代码,毕竟有时候不是完全向后兼容的. 二.使用合适的选择器 jQuery选择器性能最佳到最差方式如下: id选择器,如$('#id', c

Python 代码性能优化技巧分享_python

如何进行 Python 性能优化,是本文探讨的主要问题.本文会涉及常见的代码优化方法,性能优化工具的使用以及如何诊断代码的性能瓶颈等内容,希望可以给 Python 开发人员一定的参考. Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化.扩展以及文档相关的事情通常需要消耗 80% 的工作量.优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率. 改进算法,选择合适的数据结构 一个

Java性能优化技巧汇总_java

本文实例汇总了Java性能优化技巧.分享给大家供大家参考.具体分析如下: 这里参考了些书籍,网络资源整理出来,适合于大多数Java应用 在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. 1.尽量使用final修饰符. 带有final修饰符的类是不可派生的.在JAVA核心API中,有许多应用final的例子,例如java.lang.String.为String类指定final防止了使用者覆盖length()方法.另外,如

LAMP服务器性能优化技巧之Linux主机优化_Linux

目前LAMP (Linux + Apache + MySQL + PHP) 近几年来发展迅速,已经成为Web 服务器的事实标准. LAMP这个词的由来最早始于德国杂志"c't Magazine",Michael Kunze在1990年最先把这些项目组合在一起创造了LAMP的缩写字.这些组件虽然并不是开开始就设计为一起使用的,但是,这些开源软件都可以很方便的随时获得并免费获得.这就导致了这些组件经常在一起使用.在过去的几年里,这些组件的兼容性不断完善,在一起的应用情形变得非常普便.为了改

LAMP服务器性能优化技巧之加速PHP

目前LAMP (Linux + Apache + MySQL + PHP) 近几年来发展迅速,已经成为Web 服务器的事实标准.本文我们将介绍基于LAMP组合的服务器的性能优化技巧:加速PHP. Apache服务器优化.PHP优化.Mysql优化 1.使用eaccelerator 我们上面的介绍Apache服务器的优化,如果您曾经浏览过 PHP 的网页时,或许会发现:怎么 PHP 的速度慢慢的,这是怎么一回事啊?PHP 不是号称速度上面的反应是很快速的吗?怎么会慢慢的呢?这是由于 PHP 的程序

SQL Server数据库性能优化技巧

设计1个应用系统似乎并不难,但是要想使系统达到最优化的性能并不是一件容易的事.在开发工具.数据库设计.应用程序的结构.查询设计.接口选择等方面有多种选择,这取决于特定的应用需求以及开发队伍的技能.本文以SQL Server为例,从后台数据库的角度讨论应用程序性能优化技巧,并且给出了一些有益的建议. 1 数据库设计 要在良好的SQL Server方案中实现最优的性能,最关键的是要有1个很好的数据库设计方案.在实际工作中,许多SQL Server方案往往是由于数据库设计得不好导致性能很差.所以,要实

Android编程开发之性能优化技巧总结_Android

本文详细总结了Android编程开发之性能优化技巧.分享给大家供大家参考,具体如下: 1.http用gzip压缩,设置连接超时时间和响应超时时间 http请求按照业务需求,分为是否可以缓存和不可缓存,那么在无网络的环境中,仍然通过缓存的httpresponse浏览部分数据,实现离线阅读. 2.listview 性能优化 1).复用convertView 在getItemView中,判断convertView是否为空,如果不为空,可复用.如果couvertview中的view需要添加listern