正規表現ベンチとやら

いまさらhttp://www.ketan.jp/diary/の2008-05-28の話。ライブラリ編。
結果がつまらないので放置しておいた結果がこれだよ!
どれもWindows XP Home SP3で動かしたから他の環境では知らないよ。
みんな初めて使ったライブラリなので、使い方間違ってたらごめんなさい。

C# + .NET

using System.Text.RegularExpressions;
using System.Text;

public class RegexTest
{
    private static int len = 1024 * 1024;

    public static void Main()
    {
        StringBuilder builder = new StringBuilder(len+1);
        for (int i = 0; i < 1024 * 1024; ++i)
            builder.Append('b');
        builder.Append('x');

        string query = builder.ToString();

        Regex regex = new Regex("^b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b$");
        if (regex.IsMatch(query))
            System.Console.Out.WriteLine("yes");
        else
            System.Console.Out.WriteLine("no");
    }
}

結果:応答なし

JavaScript + Webブラウザ(IE7, Firefox3, Opera9)

javascript:query="";for(i=0;i<1024*1024;++i)query+="b";query+="x";alert(query.match(/^b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b$/)?"yes":"no")

結果:応答なし

boost::regex

#include <iostream>
#include <string>
#include <boost/regex.hpp>

using namespace std;

int main() {
  boost::regex regex("^b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b$");

  int len = 1024 * 1024;
  string query(len+1, 'b');
  query[len] = 'x';

  if (boost::regex_match(query, regex))
    cout << "yes" << endl;
  else
    cout << "no" << endl;
}

結果:応答なし

鬼車 v5.9.1

#include <stdio.h>
#include <string.h>
#include <oniguruma.h>

#define LEN (1024 * 1024)
#define PATTERN "^b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b$"

static char buf[LEN + 2];

int main(void)
{
  int i, r;
  unsigned char *at;
  regex_t* regex;
  OnigErrorInfo einfo;
  OnigRegion *region;

  for (i = 0; i < LEN; ++i)
    buf[i] = 'b';
  buf[LEN] = 'x';
  buf[LEN+1] = '\0';

  static UChar* pattern = (UChar* )PATTERN;
  static UChar* query = (UChar* )buf;

  r = onig_new(&regex, pattern, pattern + strlen((char* )pattern),
               ONIG_OPTION_DEFAULT, ONIG_ENCODING_ASCII, ONIG_SYNTAX_DEFAULT, &einfo);
  if (r != ONIG_NORMAL) {
    char s[ONIG_MAX_ERROR_MESSAGE_LEN];
    onig_error_code_to_str(s, r, &einfo);
    fprintf(stderr, "ERROR: %s\n", s);
    return -1;
  }

  region = onig_region_new();
  at = query;

  r = onig_match(regex, query, query + strlen((char*)query), at, region, ONIG_OPTION_NONE);

  onig_region_free(region, 1);
  onig_free(regex);
  onig_end();
  
  if (r >= 0)
    puts("yes");
  else
    puts("no");

  return 0;
}

結果:応答なし

Jakarta-regexp

import org.apache.regexp.RE;

public class Jakarta {
  public static void main(String[] args) {
    StringBuilder buf = new StringBuilder(1024*1024+1);
    for (int i = 0; i < 1024 * 1024; ++i)
      buf.append("b");
    buf.append("x");
    
    String query = new String(buf);
    String pattern = "^b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b.*b$";
    RE regex = new RE(pattern);
    if (regex.match(query))
      System.out.println("yes");
    else
      System.out.println("no");
  }
}

結果:スタックオーバーフロー

ベンチマーク再び

せっかく新しく買ったので、id:letter:20061215#1166194238のベンチマークを試してみたよ。

ベンチ名 自宅現PC 自宅旧PC 学科ノート(バッテリ) 学科ノート(AC)
CPU Athlon64 X2 4200+ AMD Athlon XP 2500+ Intel Pentium M 725 -
GPU NVIDIA GeForce 8600 GT NVIDIA GeForce FX 5900XT ATI MOBILITY RADEON 7500 -
ぐるみんベンチマーク 49212 31905 7110 25627
FFXI Official Benchmark3 8394-L 4236-L 1048-L 2637-L
同上 6279-H 3039-H 594-H -
ゆめりあベンチマーク(1280*960 最高) 18222 4257 - -
同上(640*480 それなり) - - 1823 -

グラボ買ったよ

要するにオンボードを騙し騙し使ってたんだけど、ディスプレイを買い換えたらいろいろとおかしくなってきたので買ったよ、という話。
数日前にUbuntu 8.04を実機に入れたんですが、Firefoxのスクロールでバッファが足りなくてチカチカするのが気になっていました。
他にもWindowsで東方をフルスクリーンでやろうとするとプレイ中に時々ブラックアウトしたり、そもそもフルスクリーンに対応していない解像度があったりと限界を感じていました。
現行PCを買った店に行って「GeForce 8600GTのそれなりのやつどれ?」と聞き、薦められたものをそのまま買ってきました。
Firefox on Ubuntuのスクロールは改善したけど、タブの切り替えにちょっち時間がかかるのがまだ気になります。
ついでにid:letter:aboutにグラボとモニタの情報を追加したよ。

postfix to infix

anarchy golf - postfix to infix
現在Cで151byte。しんどい…。
手元にあるやつの最初のバージョンは325byte(不要な改行、空白は削除済み)なので、半分以下になりました。
かっこをつけるかどうかの判定であと2byteくらいいけそうな気がしてるんだけどな。
もう残り時間もないので、布団効果*1に期待します。

*1:布団に入ってから思いつくアイディアのお陰で短くできること

ディアボロの試練クリア@ディアボロの大冒険


初クリア。*1

攻撃DISK
スター・プラチナ+5,シルバーチャリオッツ
防御DISK
クラフトワーク+31,ハーミットパープル(強化用),メタリカ,スーパーフライ,ウェザーリポート, ザ・フー
能力DISK
ハーミットパープル+2,パール・ジャム,神父にDISKを抜き取られないぞ

Lv50, MaxHP332, ターン25006, 精神力15/15, 満腹度140, 金68449G。
ディオの骨による合成2回、クレDによる合成3回。
全体MH、幽霊部屋、砂漠なし。迷宮2回。
結構運に恵まれてたと思う。以下記憶の続く限り詳細。

*1:初クリアなのに1位じゃないのはいんちき(セーブロードの繰り返し)でクリアしたことがあるからです。

続きを読む