2011-05-24 40 views
1

我以爲升壓正則表達式引擎會比升壓::算法快
這個簡單的測試顯示算法中被擊敗的正則表達式引擎大幅度增加
這是整個測試計劃
我錯過了什麼嗎?當我應該更喜歡的boost ::正則表達式(或升壓:: xpressive中)在升壓::算法

#include "boost/algorithm/string.hpp" 
#include "boost/regex.hpp" 
#include "boost/xpressive/xpressive.hpp" 
#include "boost/progress.hpp" 
#include <iostream> 

int main() 
{ 
    boost::timer tm; 
    const int ITERATIONS = 10000000; 
    { 
     std::string input("This is his face"); 
     tm.restart(); 
     for(int i = 0; i < ITERATIONS; ++i) 
     { 
      boost::algorithm::replace_all(input,"his","her"); 
     } 
     std::cout << "boost::algorithm: " << tm.elapsed()/60 << std::endl; 
    } 

    { 
     std::string input("This is his face"); 
     boost::regex expr("his"); 
     std::string format("her"); 
     tm.restart(); 
     for(int i = 0; i < ITERATIONS; ++i) 
     { 
      boost::regex_replace(input, expr, format); 
     } 
     std::cout << "boost::regex: " << tm.elapsed()/60 << std::endl; 
    } 

    { 
     std::string input("This is his face"); 
     boost::xpressive::sregex expr = boost::xpressive::as_xpr("his"); 
     std::string format("her"); 
     tm.restart(); 
     for(int i = 0; i < ITERATIONS; ++i) 
     { 
      boost::xpressive::regex_replace(input, expr, format); 
     } 
     std::cout << "boost::xpressive: " << tm.elapsed()/60 << std::endl; 
    } 

    return 0; 
} 

回答

3

正則表達式可處理各種正則表達式(例如像「我的*測試」可以像文本匹配「我不知道有多少類調用MySumTest已經寫的?」)。它們比在文本中查找模式的算法更強大但性能更差

3

我不覺得這一切都令人驚訝;簡單的事情通常會更快。在更高級別的語言中,比如說JavaScript,將字符串處理委託給正則表達式通常是一種勝利,因爲即使在解釋型語言中進行簡單的循環,仍有很多開銷,但同樣的推理不適用於像C++這樣的編譯語言。

無論如何,我會說你應該在正則表達式中使用boost字符串算法,因爲boost :: regex引入了一個運行時依賴項(它使用一個外部.so文件),而算法基本上是內聯代碼發電機,並在你需要的時候,你應該只使用正則表達式...說尋找一個浮點數:

[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)? 

,你會想嘗試,如果沒有正則表達式?