文本迭代,汇编与C ++

时间:2012-07-20 00:01:02

标签: c++ string assembly web iteration

我正在制作一个程序,其中经常阅读从网上收到的文本块,查找特定字符并相应地解析数据。我对C ++变得相当熟练,并且已经使它运行良好,但是,Assembly会比一个更快

for(size_t len = 0;len != tstring.length();len++) {
    if(tstring[len] == ',')
        stuff();
}

使用cmp和jz / jnz的内联汇编程序会更快吗?我不想浪费我的时间与asm一起工作,因为我可以说我使用它,但是为了真正的速度目的。

谢谢,

4 个答案:

答案 0 :(得分:3)

没办法。你的循环非常简单,优化器失去推理代码能力的成本将方式高于你可以获得的任何性能。这不是SSE内在函数或引导加载程序,它是一个微不足道的循环。

答案 1 :(得分:1)

逐个检查字符不是最快的事情。也许你应该尝试这样的事情,看看它是否更快。

string s("xxx,xxxxx,x,xxxx");
string::size_type pos = s.find(',');  
while(pos != string::npos){
    do_stuff(pos);
    pos = s.find(',', pos+1);       
}

循环的每次迭代都会给你一个','字符的下一个位置,这样程序只需要很少的循环来完成这项工作。

答案 2 :(得分:1)

使用“普通旧”jz / jnz的内联汇编例程不可能比您拥有的更快;也就是说,你的代码中存在一些效率低下的问题:

  • 每次循环迭代都会检索tstring.length()次;这是不必要的。
  • 你正在使用随机索引tstring[len],这可能比使用前向迭代器更昂贵。
  • 你在循环中调用stuff();根据具体情况,让循环首先在字符串中构建一个位置列表可能会更快(因此扫描的字符串以及扫描代码保持缓存热,并且不会被{{1然后只迭代这些结果。
  • 。}}}

对于这种扫描,已经有一种可能的低级优化标准库函数strchr()。 C ++ STL std::string::find()也可能已针对此目的进行了优化(和/或可能在stuff()专业化中使用strchr()

特别是char有SSE2(使用strchr()pcmpeqbmaskmov...)或SSE4.2(使用字符串op bsf)实现;例如/实际的SSE代码这样做,检查例如strchr() in GNU libc(在Linux上使用)。另请参阅参考和评论here(适当命名的网站......)。

我的建议:检查您的库实现/文档,和/或程序的实际生成的汇编代码。您可能已经在使用快速代码......或者如果您从手工制作的逐字符简单搜索切换到仅使用pcmpistristd::string::find()。 如果这是超速关键,那么内联已知/测试实现(监视许可)使用的strchr()汇编代码将消除函数调用并获得几个周期。取决于您的要求...代码,基准,变化,再次基准,......

答案 3 :(得分:0)

  

使用cmp和jz / jnz的内联汇编程序会更快吗?

也许,也许不是。这取决于stuff()做什么,tstring的类型和范围是什么,以及你的装配是什么样的。

首先,测量可维护C ++代码的速度。只有当这个循环支配你的程序速度时才应该考虑重写它。

如果您选择重写它,请保持两种实现可用,并相对地测量它们。如果速度更快,速度增加很重要,只能使用维护较少的版本。此外,由于您拥有原始版本,未来的读者即使不了解您的意图也能理解您的意图。