regex_match为8秒("",正则表达式("。{40000}"));?

时间:2016-12-10 11:43:12

标签: c++ regex performance

更新2:实际上它是from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker engine = create_engine('mysql+pymysql://user:pass@localhost/dbname', echo=False) Base = declarative_base() class Btc_ohlc(Base): __tablename__ = 'btc_ohlc' btc_ohlc_id = Column('id', Integer, primary_key=True) btc_ohlc_unix_timestamp = Column('unix_timestamp', Integer) btc_ohlc_open = Column('open', Integer) btc_ohlc_high = Column('high', Integer) btc_ohlc_low = Column('low', Integer) btc_ohlc_close = Column('close', Integer) def __init__(self, btc_ohlc_unix_timestamp, btc_ohlc_open, btc_ohlc_high, btc_ohlc_low, btc_ohlc_close): self.btc_ohlc_unix_timestamp self.btc_ohlc_open self.btc_ohlc_high self.btc_ohlc_low self.btc_ohlc_close Session = sessionmaker(bind=engine) session = Session() btc_ohlc = Btc_ohlc(1, 2, 3, 4, 5) session.add(btc_ohlc) session.commit() 。仅这一点已经花了那么多时间。为什么呢?

regex(".{40000}");在我的电脑上花了将近8秒钟。为什么?难道我做错了什么?我在i7-6700上使用Windows 10上MinGW的gcc 4.9.3。

这是一个完整的测试程序:

regex_match("", regex(".{40000}"));

我如何编译并运行它:

#include <iostream>
#include <regex>
#include <ctime>
using namespace std;

int main() {
    clock_t t = clock();
    regex_match("", regex(".{40000}"));
    cout << double(clock() - t) / CLOCKS_PER_SEC << endl;
}

更新:看起来时间是给定数字的二次方。加倍它的时间大约是四倍:

C:\Users\ ... \coding>g++ -std=c++11 test.cpp

C:\Users\ ... \coding>a.exe
7.643

代码:

  10000   0.520 seconds (factor 1.000)
  20000   1.922 seconds (factor 3.696)
  40000   7.810 seconds (factor 4.063)
  80000  31.457 seconds (factor 4.028)
 160000 128.904 seconds (factor 4.098)
 320000 536.358 seconds (factor 4.161)

仍然不知道为什么。它是一个非常简单的正则表达式和空字符串(虽然它与短非空字符串相同)。它应该立即失败。正则表达式引擎是不是很奇怪而且很糟糕?

2 个答案:

答案 0 :(得分:2)

因为它想要快......

很有可能将此正则表达式转换为更容易,更快速运行的另一种表示形式(状态机或其他)。 C#允许生成代表正则表达式的运行时代码。

在您的情况下,您可能会遇到具有O(n^2)复杂度的转换中的一些错误。

答案 1 :(得分:1)

分别测量结构和匹配:

clock_t t1 = clock();
regex r(".{40000}");
clock_t t2 = clock();
regex_match("", r);
clock_t t3 = clock();

cout << double(t2 - t1) / CLOCKS_PER_SEC << '\n'
     << double(t3 - t2) / CLOCKS_PER_SEC << endl;

我明白了:

0.077336
0.000613