我见过第一个在另一种代码和我想,这种长度的比较已经完成增加码生产力。这是用在分析对于一个脚本语言,与一个特定的词典:话是4到24个字母的平均值为7-8lettets,字包括26个拉丁字母加上"@","$"和"_".

长度的比较分别用于逃避==操作者的工作与STL串,这显然需要更多的时间,然后简单的整数比较。但在同一时间的第一封信分发的词典给出的只是广泛的,比分配的话大小,所以两个首字母相比串通常会更经常不同的,比大小的弦。这使得长度比不必要的。

我跑一些测试,是我发现了什么出:同时试验两个随机的字符串比百万次、第二种方法快很多,因此长度的比较似乎是有益的。但是,在一个工作项目,它的工作甚至更慢,在调试模式和insufficiantly更快地释放方式。

因此,我的问题是:为什么长度的比较可以固定的比较以及为什么它可以慢下来?

UPD:我不喜欢这第二种方式,但它已经做了一原因,我想,我不知道,什么是这个原因。

UPD2:说真的,问题不是如何做到最好的。我甚至不使用STL串在这种情况下了。有没有不知道,长度相比较是不必要的和错误等。不知道是的-这真倾向于工作稍微好一点在一定的测试。这怎么可能?

有帮助吗?

解决方案

在随机测试中,字符串可能已经足够长以显示增益,而在实际情况下,您可以处理较短的字符串,并且两个比较的常数因子不会被不执行字符串比较部分的任何增益所抵消。测试。

其他提示

如果重要,请假设您的图书馆已经这样做了。除非真的很重要,否则不要以这种方式搞砸你的代码进行微观优化。

当可能短路是有益的

短路优化可能是有用的,只有当:

  • 成本比较低的成本相比的全面测试
  • 比较结果往往是在短路

数学上,让我们以成本的短路条件,F费用的充分条件,以及P被%的情况下在哪里短路发生的(充分的条件是不必要的)。

平均成本的原始情况(没有短路)是F

平均成本的短路优化S+F*(1-P)

因此,如果优化是具有任何效益,以下必须适用于:

S+F*(1-P) < F

S < F*P

串的比较成本

进一步写道:

这显然需要更多的时间,然后简单的整数比较。

这不是显而易见的。串比较终止时,第一差异被发现,因此取决于什么样的串你过程中,它可以终止第一或第二字在绝大多数的情况。此外,比较可以优化甚至更长串通过第一个双字比较(4个字符的一次),只要有足够的数据在这两个串。

你的情况

主要的差异之间的随机测试数据和脚本分析是真实的数据远远不是随机的。分析程序是最有可能确定性,并且一旦它相匹配,它并不比任何的更多。甚至脚本数据不是随机的-一些关键词都有可能被用于很多其他人。如果分析程序是构建这样一种方式检查最常用的关键词首先,一个令人惊奇地高数的比较,可能需要完整的比较工作要做,以充分进行比较总是需要做的时候串匹配。

一般来说,你应该把它留给STL而不用担心它。

但是,如果这是一个你需要优化的区域(我非常怀疑),如果你理解字符串的字母分布/长度分布,你可以从字符串派生一个新类,并重载==运算符以最有效的方式为您的应用程序执行相等测试。 (长度优先,第一个角色优先,前进,后退,无论如何)。

这比在整个代码中散布“优化”要好。

std :: string operator ==的实现无法知道首先检查长度或开始检查字符是否更快。清楚地检查长度是相同长度的弦的浪费。因此,STL的不同实现可能会以不同的方式执行。

仅将显式长度签入作为最终优化(明确注释),并且仅在您的探查者确认好处时才会进行。

长度比较对我没有任何意义..使用比较运算符就足够了

解雇您的STL实施。没关系

长度比较是为了尝试一些短路优化。

我假设长度比较比完整的字符串比较更快,所以如果这可以消除99%的不匹配,那么它将比每次进行完整的字符串比较更快。

代码将执行长度比较,它将失败,然后它将忽略完整的字符串比较并跳过代码。

std :: string的长度很可能是std :: string对象的成员。相比之下,第一个角色很可能在堆上。这意味着比较字符串长度可以改善引用的局部性。当然,通过短字符串优化,这变得更加复杂 - Lhs [0] 可能在堆上,而 Rhs [0] 在堆栈上。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top