<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
  <title>ビジネスP2Pソフト開発のアリエル・エリア・ブログ</title>

  <!-- some meta information (search engines might read this) -->
  <meta name="generator" content="Nucleus CMS v3.22" />
  <meta name="description" content="" />

  <!-- stylesheet definition (points to the place where colors -->
  <!-- and layout is defined -->
  <link rel="stylesheet" type="text/css" href="http://dev.ariel-networks.com/blog/skins/top/default.css" />

  <!-- prevent caching (can be removed) -->
  <meta http-equiv="Pragma" content="no-cache" />
  <meta http-equiv="Cache-Control" content="no-cache, must-revalidate" />
  <meta http-equiv="Expires" content="-1" />
  
  <!-- extra navigational links -->
  <link rel="bookmark" title="Nucleus" href="http://nucleuscms.org/" />
  <link rel="archives" title="Archives" href="xml-rss2.php?archivelist=6" />
  <link rel="top" title="Today" href="xml-rss2.php?blogid=6" />

  <!-- link RSS as alternate version -->
  <link rel="alternate" type="application/rss+xml" title="RSS" href="xml-rss2.php" />

  <!-- RSD support -->
  <link rel="EditURI" type="application/rsd+xml" title="RSD" href="rsd.php" />

</head>
<body>

<div class="header">
	<div class="headerlogo"><a href="http://www.ariel-networks.com">
        <span style="width:72px; height:46px; cursor:hand; cursor:pointer;"></span></a></div>
	<div class="headertitle"></div>
</div>

<!-- here starts the code that will be displayed in your browser -->
<div class="contents">
 <!-- page title -->
 <h1>Ariel Area Blogs</h1>

 <!-- this is a normally hidden link, included for accessibility reasons -->
 <a href="#navigation" class="skip">ナビゲーションへジャンプ</a>

 <!-- this tag inserts a weblog using the template named 'default' and  -->
 <!-- showing 15 entries                                                -->
 <h2>2007・02・28</h2>
<h3 class="item">全文検索エンジンFreyaSXについて(2回目)</h3>

<div class="itembody">
  12月1日の書き込みに対する続きですですが、最初から全部載せます。<br />
<br />
全文検索エンジンFreyaSXについて<br />
<br />
1. FreyaSXについて<br />
==================<br />
<br />
FreyaSX は Freya をベースに開発された全文検索エンジンで、産業技術総合研究所において、DeleGateの作者の佐藤豊さんという方が開発しています。Freya は、原田昌紀さんという方が開発された全文検索エンジンです。FreyaSXのサイトのURIは、下記になります。<br />
<br />
<a href="http://www.delegate.org/freyasx/index-ja.html" target="_blank">http://www.delegate.org/freyasx/index-ja.html</a><br />
<br />
"Freya"のサイトは下記になります。<br />
<br />
<a href="http://www.ingrid.org/ja/project/freya/" target="_blank">http://www.ingrid.org/ja/project/freya/</a><br />
<br />
2. redhat9での使用手順<br />
======================<br />
<br />
下記のファイルをダウンロードします。<br />
<a href="ftp://ftp.delegate.org/pub/freyasx/freyasx.tar.gz" target="_blank">ftp://ftp.delegate.org/pub/freyasx/freyasx.tar.gz</a><br />
<br />
解凍、展開します。<br />
<br />
# gunzip freyasx.tar.gz<br />
# tar xvf freyasx.tar<br />
<br />
下記のディレクトリ及びファイルが展開されます。<br />
<br />
freyasx/INSTALL.sh<br />
freyasx/test/<br />
freyasx/test/fhttpd.conf<br />
freyasx/test/index.shtml<br />
freyasx/test/any2fdif.conf<br />
freyasx/delegate8.9.7-pre1.tar.gz<br />
freyasx/freyasx-0.99.10.tar.gz<br />
 <br />
INSTALL.shを実行します。<br />
<br />
# cd freyasx<br />
# ./INSTALL.sh<br />
<br />
INSTALL.shを実行すると下記のメッセージが表示されます。  <br />
<br />
////////////////////////////////////////////////////////////////////<br />
      FreyaSX installer<br />
                               FreyaSX ver. 0.99.10<br />
                               DeleGate ver. 8.9.7-pre1<br />
                               September 20, 2004, Yutaka Sato<br />
////////////////////////////////////////////////////////////////////<br />
 <br />
Detailed log is put into "INSTALL.log"<br />
 <br />
<h3 class="wiki">extracting FreyaSX-0.99.10 ...</h3>
<h3 class="wiki">making FreyaSX-0.99.10 ...</h3>
<h3 class="wiki">extracting DeleGate/8.9.7-pre1 ...</h3>
<h3 class="wiki">making DeleGate/8.9.7-pre1 ...</h3>
 <br />
Installing to here: /root/freyasx<br />
  /root/freyasx/bin<br />
  /root/freyasx/etc<br />
  /root/freyasx/cgi-bin<br />
  /root/freyasx/bank<br />
 <br />
0) You can remove following unnecessary files:<br />
<div class="hr"><hr /></div>
  rm -r /root/freyasx/delegate8.9.7-pre1<br />
  rm -r /root/freyasx/freyasx-0.99.10<br />
  rm -r /root/freyasx/INSTALL.log<br />
 <br />
1) Complete the installation and setup your environmnet as follows:<br />
<div class="hr"><hr /></div>
  export FSXHOME=/root/freyasx<br />
  export PATH="$FSXHOME/bin:$PATH"<br />
 <br />
2) Then, you can test it as follows:<br />
<div class="hr"><hr /></div>
  findex sx<br />
  fsearch sx "freya*"<br />
  any2fdif -r http://www.delegate.org/freyasx | findex sx<br />
  any2fdif -r $HOME/Mail | findex mail<br />
 <br />
3) Also you can start HTTP server for this FreyaSX and test it:<br />
<div class="hr"><hr /></div>
  fhttpd -P8880<br />
  ... then open URL "http://localhost.localdomain:8880/test" in your WWW browser <br />
See http://www.delegate.org/freyasx/ for more details<br />
////////////////////////////////////////////////////////////////////<br />
<br />
FreyaSX ver. 0.99.10とDeleGate ver. 8.9.7-pre1がインストールされます。DeleGateは、プロキシサーバです。Delegateについては、下記のページが分かりやすかったです。<br />
<br />
<a href="http://masui.net/FreeBSD/step2/chap10.html" target="_blank">http://masui.net/FreeBSD/step2/chap10.html</a><br />
<br />
上記メッセージに従って環境変数の設定を行います。<br />
上記メッセージにはありませんが、DGROOTの値も設定しておきます。DGROOTは、Delegateのホームディレクトリになります。<br />
.bash_profileに追加します。<br />
<br />
<div class="hr"><hr /></div>
# .bash_profile<br />
<br />
# Get the aliases and functions<br />
if [ -f ~/.bashrc ]; then<br />
	. ~/.bashrc<br />
fi<br />
<br />
# User specific environment and startup programs<br />
DGROOT=/home/fukushima/freyasx/<br />
FSXHOME=/fukushima/freyasx<br />
PATH=$PATH:$HOME/bin:$FSXHOME/bin<br />
BASH_ENV=$HOME/.bashrc<br />
USERNAME="root"<br />
<br />
export USERNAME BASH_ENV PATH FSXHOME DGROOT<br />
<div class="hr"><hr /></div>
<br />
.bash_profileを再読み込みします。<br />
<br />
# source .bash_profile<br />
<br />
次に索引の作成を行います。<br />
findexが、索引を作成するコマンドです。<br />
any2fdifは、findexが受け付けるfdif形式にファイルを変換するコマンドです。<br />
sxという索引については、INSTALL.shによって既に作成されているので、findexコマンドを実行しなくても、fsearch sx "freya*"で検索できます。<br />
<br />
試しに、aironeのデータ保存フォルダに対して、索引を作成します。最新版のaironeのデータ保存フォルダは暗号化されているので、とりあえず、v1.0のデータ保存フォルダを使用します。<br />
<br />
# any2fdif -r 1 | findex airone<br />
<br />
freyasxは、検索を実行するCGIが用意されているので、このCGIを利用して、検索を実行しています。<br />
fhttpdを起動します。<br />
<br />
[fukushima@localhost fukushima]$ fhttpd -P8880<br />
<DeleGate/8.9.7-pre1> [2465] -P8880 READY<br />
DGROOT=/home/fukushima/freyasx<br />
ADMIN=you@your.domain<br />
AIST-Product-ID: 2000-ETL-198715-01, H14PRO-049, H15PRO-165<br />
Copyright (c) 1994-2000 Yutaka Sato and ETL,AIST,MITI<br />
Copyright (c) 2001-2004 National Institute of Advanced Industrial Science and Te<br />
chnology (AIST)<br />
<br />
ブラウザを起動し、下記のURIを指定します。<br />
IPアドレスは環境に合わせてください）<br />
<br />
<a href="http://192.168.0.152:8880/cgi-bin/fsearch.cgi?pfx=ja&index=airone&sort=date&key=fukushima" target="_blank">http://192.168.0.152:8880/cgi-bin/fsearch.cgi?pfx=ja&index=airone&sort=date&key=fukushima</a>*<br />
<br />
（次回に続く）<br />

  
</div>

<div class="iteminfo">
  2007 02 28 21:34 -
  fukushima -
  <a href="xml-rss2.php?itemid=397#trackback">
  トラックバック(<b>DISALLOWED (TrackBack)</b>)</a>
  
</div>
<h2>2005・12・27</h2>
<h3 class="item">移動しました</h3>

<div class="itembody">
  <a href="http://dev.ariel-networks.com/Members" target="_blank">http://dev.ariel-networks.com/Members</a><br />
or<br />
<a href="http://dev.ariel-networks.com/Members/inoue" target="_blank">http://dev.ariel-networks.com/Members/inoue</a><br />
です。<br />
<br />
過去のblogは削除しないので、リンクは自由にしてください。<br />

  
</div>

<div class="iteminfo">
  2005 12 27 23:29 -
  inoue -
  <a href="xml-rss2.php?itemid=714#trackback">
  トラックバック(<b>DISALLOWED (TrackBack)</b>)</a>
  
</div>
<h2>2005・12・20</h2>
<h3 class="item">EoE</h3>

<div class="itembody">
  EoE (Ethernet over Ethernet)<br />
<a href="http://itpro.nikkeibp.co.jp/article/COLUMN/20051216/226378/" target="_blank">http://itpro.nikkeibp.co.jp/article/COLUMN/20051216/226378/</a><br />
<br />
誰かから口頭で聞いていたら、冗談だと思って聞き流したと思います。<br />
Ethernetによる本格的なルーティングが行われても、不思議ではない世の中です。<br />
<br />
TCP/IPをC言語に例えると、一部アセンブラで書いてチューニングしました、の印象です(この観点では、MPLSにも似た匂いを感じます)。<br />

  
</div>

<div class="iteminfo">
  2005 12 20 00:32 -
  inoue -
  <a href="xml-rss2.php?itemid=713#trackback">
  トラックバック(<b>DISALLOWED (TrackBack)</b>)</a>
  
</div>
<h2>2005・12・19</h2>
<h3 class="item">メンテナンスなどなど</h3>

<div class="itembody">
  メンテナンス+サーバシステムの移行を12/26にします。なので、その日はサーバがよく止まります。<br />
ついでに、ブログなどのURLも変わります。過去のブログのデータは参照だけになります。<br />
<br />

  
</div>

<div class="iteminfo">
  2005 12 19 11:46 -
  ohtani -
  <a href="xml-rss2.php?itemid=712#trackback">
  トラックバック(<b>DISALLOWED (TrackBack)</b>)</a>
  
</div>
<h2>2005・12・18</h2>
<h3 class="item">ジングルベル from Google (libjingle)</h3>

<div class="itembody">
  Libjingle - Google Talk Voice and P2P Interoperability Library<br />
<a href="http://code.google.com/apis/talk/index.html" target="_blank">http://code.google.com/apis/talk/index.html</a><br />
<br />
P2Pと言っても、いわゆる多ノード協調環境としてのP2Pではなく、NATを越えてPeer間の1対1のセッションを確立する機能を提供するライブラリです。このライブラリで、WinnyやWinMXがすぐに作れるわけではありません。<br />
ダウンロードして少しソースを見てみました。<br />
<br />
<ol>
<li>ライセンスはBSD系ライセンス</li>
<li>言語はC++です。サイズは、.hと.ccを合わせて3万行強(exampleコードとthird_partyのlibaudioコードは除く)</li>
<li>STLを使っています。テンプレートばりばりのコードではありません。</li>
<li>クラス名とメソッド名はらくだ式、変数はへび式とらくだ式が混在(モジュールごとに作者が違うせい?)。</li>
<li>XMLパーサは<a href="http://expat.sourceforge.net/">expat</a>をクラスでラップしています(*1)</li>
<li><a href="http://sigslot.sourceforge.net/">sigslot</a>を使っています(*2)。コードは、かなりsigslotに依存していそうです。</li>
<li>Boostの<a href="http://www.boost.org/libs/smart_ptr/scoped_ptr.htm">scoped_ptr</a>を使っています(Boostには非依存です。scoped_ptrのヘッダだけ取り込んでいます)。</li>
<li>通信プロトコルは、<a href="http://dev.ariel-networks.com/modules/xfsection/article.php?articleid=17">XMPP</a>の拡張(Jingle)です。</li>
</ol>
<br />
<br />
(*1)(expatはAirOneでも使っている、高速XMLパーサです)<br />
(*2)sigslotはイベントドリブン的なコードを書くためのライブラリです。イベントループを持たないので、イベントと言うよりフックと言った方が適切かもしれません。作者は女性です。<br />

  
</div>

<div class="iteminfo">
  2005 12 18 01:50 -
  inoue -
  <a href="xml-rss2.php?itemid=711#trackback">
  トラックバック(<b>DISALLOWED (TrackBack)</b>)</a>
  
</div>
<h2>2005・12・16</h2>
<h3 class="item">「なるほどナットク! P2Pがわかる本」を読みました</h3>

<div class="itembody">
  岩田さんの「なるほどナットク! P2Pがわかる本」を読みました。<br />
<a href="http://sats.zekku.com/daylist_html?year=2005&month=10&day=20" target="_blank">http://sats.zekku.com/daylist_html?year=2005&month=10&day=20</a><br />
<br />
だいぶ前から机の上に積んであった気がしますが、ようやく読みました。(おそらく)2年以上積んであった<a href="http://dev.ariel-networks.com/blog/inoue.php?blogid=2&archive=2005-10-25">「イノベーションのジレンマ」</a>に比べると、だいぶ速いので許してください。<br />
<br />
<br />
良い点:<br />
こういう概論的な本では、<br />
<ul>
<li>言葉の定義(言葉と意味の対応)が明確であること</li>
<li>言葉の使い方が一貫していること</li>
<li>上の対応が作る概念体系に矛盾が無いこと</li>
</ul>
が重要で、ここらに問題があると読んでいて頭に来ますが、この本はきちんとしています。さすが岩田さん、エックスアリエルです。<br />
<br />
悪い点:<br />
1. <br />
暗号化に対する「復号」が、「複合」になっています。一箇所だけのtypoではなく、全編に渡ってtypoしています。<br />
<br />
2. <br />
p168の「電子証明書と秘密鍵の管理」はいまいちです。アリエル社内でも誤解している人がいるので、アリエルエリアに記事を書きました。<br />
「証明書と鍵に関する、ありがちなメタファーとありがちな間違い」<br />
<a href="http://dev.ariel-networks.com/modules/xfsection/article.php?articleid=60" target="_blank">http://dev.ariel-networks.com/modules/xfsection/article.php?articleid=60</a><br />
# 書いて思いましたが、誤ったメタファーに、メタファーで対抗するのは間違いかもしれません。<br />
<br />
3.<br />
前書きで井上に対する謝辞が無い(第二版に期待...)。<br />
<br />
<br />
項目の量だけ見ると、悪い点の方が多いですが、良い本なので勘違いしないようにしてください。<br />

  
</div>

<div class="iteminfo">
  2005 12 16 03:54 -
  inoue -
  <a href="xml-rss2.php?itemid=710#trackback">
  トラックバック(<b>DISALLOWED (TrackBack)</b>)</a>
  
</div>
<h2>2005・12・09</h2>
<h3 class="item">地獄のペアプログラミング</h3>

<div class="itembody">
  今日、拘束14時間、約12時間のペアプログラミングをしました。嫌い嫌い大好きXPって感じです。<br />
<br />
端で見ているから他人のミスに気づくという側面もありますが、辛口ながら、ミスの多さは偶然では無いと思いました。以下、少し愚痴っぽい話ですが、プログラミングの基本的な部分を含んでいるので書きます。<br />
# 以下の例で命名が甘いですが、そこは論点では無いので無視してください。<br />
<br />
<br />
<ul>
<li>データ構造への視点が甘い</li>
</ul>
「データ構造」と言っても、高度な話ではありません。非常に基本的な話です。<br />
簡単に言うと、Cで書くと<br />
struct foo_t {<br />
  int x;<br />
  int y;<br />
} foo[N];<br />
のようなデータ構造であるべきものを、次のように書いていました。<br />
int arr_x[N];<br />
int arr_y[N];<br />
<br />
要は、構造体の配列であるべきところが、複数の配列になっています。<br />
<br />
配列arr_xと配列arr_yが(暗黙に)関係しています。結果として、これらを参照するコードは次のようになります。<br />
for (i = 0; i < N; i++) {<br />
  int x = arr_x[i];<br />
  int y = arr_y[i];<br />
  // xとyはペアで使われる<br />
}<br />
<br />
以前、プロのプログラマ歴20年以上の人がこんなコードを書いたので、速攻で直させました。例え、動いたとしても、こんなコードは、存在そのものが許せません。<br />
<br />
今日は諸般の事情により放置されました... (言語がPerlだったというのも理由のひとつです。Cだったら10分で書き直すのですが、Perlのリファレンスとハッシュのコードを10分で書き直す自信がありませんでした。会社に戻ったら、隣の凄い人にバカにされそうです)<br />
<br />
<br />
<br />
<ul>
<li>フラグの直交性への視点が甘い</li>
</ul>
フラグ変数が多すぎる、という問題もありますが、実はぼく自身もフラグ変数を結構使うのであまり人のことは言えません。<br />
しかし、フラグの直交性には気を使います。ここでのフラグの直交性を簡単に説明すると、次のような話です。フラグ変数a,b,cと3つあった時、フラグcに「aかつb」の意味しか無い時、フラグ変数cの存在を許してはいけません。途中でフラグの意味が変わって、気づいたらフラグ変数cの意味がそうなっていた時も、即刻フラグ変数cを削除すべきです。<br />
cの部分の記述性を明示したいなら、ぼくなら、次のようなマクロでCの部分の記述性を明確化します(Perlなら、まあ関数にでもするのでしょう)。<br />
#define IS_C(conf)  ((conf)->is_a && (conf)->is_b)<br />
<br />
<br />
<br />
<ul>
<li>呼ぶ-呼ばれる関係への視点が甘い</li>
</ul>
「呼ぶ-呼ばれる関係」はぼくの用語ですが、雰囲気で察してください。<br />
コードに問題がある時、呼ぶ側の問題なのか呼ばれる側の問題なのかの区別をすることは重要です。この区別を素早く行うためには、呼ぶ側と呼ばれる側を切り離す「感覚」が必要です。<br />
今日のペアプログラミングで、呼び出す外部コマンドが未実装、という状況でした。切り離す感覚があれば、とりあえず何もしない(キックされたことだけが分かる)ダミーの外部コマンドを用意して、あると仮定してテストはできます。外部コマンドでも関数呼び出しでも同じようなものです。今風のモックオブジェクトという用語もありますが、頭での理解より、切り離すと言うか突き放すと言うか、そういう感覚が先です。<br />
このような切り離す感覚があれば、呼ばれる側だけの単体テスト、呼ぶ側だけの単体テスト、と小さな部品ごとの動作確認の意識にもつながります。今風にユニットテストと言う用語もありますが、これも頭での理解の前に、区切って隔離するとでも言うべき、感覚の方が先です。<br />
<br />
<br />
<br />
<ul>
<li>その他</li>
<ul>
<li>printfデバッグもバカにしたものではありません</li>
<ul>
<li>1分でprintfが書けるなら、コードを見てなぜ動かないのか考えているより、たぶん解決は速いです。</li>
</ul>
</ul>
</ul>
<br />
<ul>
<ul>
<li>気になることはコードに書いておきます</li>
<ul>
<li>コードを見ていると、気になる部分が見つかります。一瞬で直せれば直しますが、後で良さそうなものは、コードにコメントでメモっておきます。BSD系の伝統に従い、ぼくはXXXコメントと呼んでいます。気になる部分の多いコードだと、あちこちにXXXマークがつきます。本を読んでいて、気になるページにしおりをはさんだり、メモを書いたりする感覚に近いです。</li>
</ul>
</ul>
</ul>

  
</div>

<div class="iteminfo">
  2005 12 09 03:19 -
  inoue -
  <a href="xml-rss2.php?itemid=709#trackback">
  トラックバック(<b>DISALLOWED (TrackBack)</b>)</a>
  
</div>
<h2>2005・12・08</h2>
<h3 class="item">BPなんとか</h3>

<div class="itembody">
  <a href="http://www.jsys-products.com/iwaken/index.html" target="_blank">http://www.jsys-products.com/iwaken/index.html</a><br />
から<br />
<a href="http://www.jsys-products.com/iwaken/bpmn/pub/Modeling_Forum_2005.pdf" target="_blank">http://www.jsys-products.com/iwaken/bpmn/pub/Modeling_Forum_2005.pdf</a><br />
の44ページ。<br />
<br />
<a href="http://www.bpmi.org/">BPMI (Business Process Management Initiative)</a>の標準BPMスタックには、<br />
  BPMN、BPSM、BPXL、BPEL、BPQL<br />
があります。これらはWS-なんとか、の上に位置するようです。<br />
全然分からないので、今度、ワークスの人に教えてもらいます。<br />
<br />
誰か、BPMNでソフトウェア開発プロセスを記述してください。<br />
<br />
参考: @ITの連載記事<br />
<a href="http://www.atmarkit.co.jp/farc/rensai/bpmn01/bpmn01.html" target="_blank">http://www.atmarkit.co.jp/farc/rensai/bpmn01/bpmn01.html</a><br />

  
</div>

<div class="iteminfo">
  2005 12 08 03:24 -
  inoue -
  <a href="xml-rss2.php?itemid=708#trackback">
  トラックバック(<b>DISALLOWED (TrackBack)</b>)</a>
  
</div>
<h2>2005・12・02</h2>
<h3 class="item">ワークス、アリエル共同勉強会の資料を公開しました</h3>

<div class="itembody">
  <a href="http://dev.ariel-networks.com/modules/xfsection/index.php?category=14" target="_blank">http://dev.ariel-networks.com/modules/xfsection/index.php?category=14</a><br />
<br />
第1回目は、須崎さんがAJAXの講師をしてくれました。<br />
須崎さんと言えば、知る人ぞ知る、<a href="http://dev.ariel-networks.com/blog/suzaki.php?blogid=12&archive=2004-12-9">2004/12/9にAJAX的方法論に言及していた人</a>です。ちなみに、AJAXという言葉が生まれたのは、<a href="http://www.adaptivepath.com/publications/essays/archives/000385.php">2005/2/18</a>です。<br />
<br />
外人が言うとそれに合わせて一緒に語り出す、その辺の日本人とは格が違います。日本シリーズの先発とアジアシリーズの先発ぐらい格が違います。<br />

  
</div>

<div class="iteminfo">
  2005 12 02 16:03 -
  inoue -
  <a href="xml-rss2.php?itemid=707#trackback">
  トラックバック(<b>DISALLOWED (TrackBack)</b>)</a>
  
</div>
<h2>2005・12・01</h2>
<h3 class="item">排他制御のパフォーマンス</h3>

<div class="itembody">
  <a href="http://apr.apache.org/">apr</a>のprimitiveな排他制御のパフォーマンスを調べてみました。<br />
やっていることは単純で、lock、unlockを次のようにひたすらループで回すだけです。<br />
<br />
#define NUM_LOOP  10000000<br />
  now = apr_time_now();<br />
  for (i = 0; i < NUM_LOOP; i++) {<br />
      apr_thread_mutex_lock(mutex);<br />
      apr_thread_mutex_unlock(mutex);<br />
  }<br />
  printf("mutex: %" APR_INT64_T_FMT "\n", apr_time_now() - now - nop);<br />
<br />
nopは、あらかじめ何もしないループを回した時の計測時間です。<br />
APR_INT64_T_FMTの部分は、GNU/Linuxではlld、WindowsではI64dに置き換わるマクロです(64bit整数のprintf用書式指定にプラットフォーム依存があるためのマクロです)。<br />
<br />
普通のmutexとread-write lockをGNU/Linuxで計測したことはあったのですが、今回、次のふたつを初めてやりました。<br />
<br />
<ul>
<li>Windowsでの計測</li>
<li>atomic APIの計測</li>
</ul>
<br />
atomic APIは、<a href="http://httpd.apache.org/docs/2.0/misc/perf-tuning.html#compiletime">apacheのパフォーマンスチューニング</a>で紹介されているAPIです。<br />
Windowsでは、InterlockedIncrement()などのAPIのラッパーになっています。<br />
GNU/Linux(x86)では、次のようなアセンブラに展開されるマクロになっています。<br />
<br />
  #define apr_atomic_cas(mem,with,cmp) \<br />
  ({ apr_atomic_t prev; \<br />
      asm volatile ("lock; cmpxchgl %1, %2"              \<br />
           : "=a" (prev)               \<br />
           : "r" (with), "m" (*(mem)), "0"(cmp) \<br />
           : "memory"); \<br />
      prev;})<br />
<br />
<br />
何回か実行しておかしな変動要因が無いことを確認した結果、次のような数値になりました。細かい数値はあまり意味がありません。桁だけの世界です。<br />
CPUの性能が低すぎて書き間違いではないかと思われるかもしれませんが、事実です。<br />
aprの排他制御系のAPIは、OSのAPIのthinラッパーなので、GNU/Linuxの場合はpthread系API、Windowsの場合はWin32 APIそのものと思っても大きな誤差はありません。<br />
<br />
<br />
計測項目:<br />
<ul>
<li>mutex(unnested): nestを許さないmutex lock</li>
<li>mutex(nested): nestを許す、つまり同一スレッドが連続してlockを呼んでもブロックしないmutex lock</li>
<li>rwlock(write lock): read-write lockのwrite lock</li>
<li>rwlock(read lock): read-write lockのread lock</li>
<li>atomic(add): atomic APIのaddオペレーション</li>
</ul>
<br />
GNU/Linux (Debian sarge、Linux 2.4.30、libc 2.3.2、Athlon 650MHz):<br />
<ul>
<li>mutex(unnested) ... 約2600000マイクロ秒/1千万回 ...1回あたり約0.25マイクロ秒</li>
<li>mutex(nested) ...約5600000マイクロ秒/1千万回 ...1回あたり約0.56マイクロ秒</li>
<li>rwlock(write lock) ... 約4300000マイクロ秒/1千万回 ...1回あたり約0.43マイクロ秒</li>
<li>rwlock(read lock) ... 約5800000マイクロ秒/1千万回 ...1回あたり約0.58マイクロ秒</li>
<li>atomic(add) ...約460000マイクロ秒/1千万回 ...1回あたり約0.046マイクロ秒</li>
</ul>
<br />
Windows (Windows2000 SP4、Athlon 1.1GHz):<br />
<ul>
<li>mutex(unnested) ... 約12000000マイクロ秒/1千万回 ...1回あたり約1.20マイクロ秒</li>
<li>mutex(nested) ...約700000マイクロ秒/1千万回 ...1回あたり約0.07マイクロ秒</li>
<li>rwlock(write lock) ...約12200000マイクロ秒/1千万回 ...1回あたり約1.22マイクロ秒</li>
<li>rwlock(read lock) ...約41100000マイクロ秒/1千万回 ...1回あたり約4.11マイクロ秒</li>
<li>atomic(add) ...約90000マイクロ秒/1千万回 ...1回あたり約0.009マイクロ秒</li>
</ul>
<br />
<br />
新しい発見。<br />
GNU/Linuxでnested mutexの方が遅いので、Windowsでも同じだと思っていました。事実は、Windowsではnestedを許すmutexの方が速いです。<br />
<br />
atomicオペレーションは圧倒的に速いのでatomicで置き換えられる箇所はmutex lockから置き換えたいです。実際は変数ひとつを守るだけのmutex lockはあまり無いですが。<br />

  
</div>

<div class="iteminfo">
  2005 12 01 03:03 -
  inoue -
  <a href="xml-rss2.php?itemid=706#trackback">
  トラックバック(<b>DISALLOWED (TrackBack)</b>)</a>
  
</div>


</div><!-- end of the contents div -->



<!-- definition of the menu -->
<div class="menu">
 <!-- accessibility anchor -->
 <a name="navigation" id="navigation" class="skip"></a>
 <h1 class="skip">ナビゲーション</h1>

 <h2>ナビゲーション</h2>
 <ul  class="nobullets">
<li><a href="http://dev.ariel-networks.com/blog/inoue.php?blogid=2">井上</a></li>

<li><a href="http://dev.ariel-networks.com/blog/iwata.php?blogid=3">岩田真一</a></li>
<li><a href="http://dev.ariel-networks.com/blog/index.php?blogid=1">おおたに</a></li>
<li><a href="http://www.liris.org/">おおたに@home</a></li>
<li><a href="http://dev.ariel-networks.com/blog/nakayama.php?blogid=11">なかやま</a></li>

<li><a href="http://dev.ariel-networks.com/blog/suzaki.php?blogid=12">すざき</a></li>
<li><a href="http://dev.ariel-networks.com/blog/tanaka.php?blogid=18">たなか</a></li>
<li><a href="http://dev.ariel-networks.com/blog/fukushima.php?blogid=10">ふくしま</a></li>
<li><a href="http://dev.ariel-networks.com/blog/katagishi.php?blogid=5">Katagishi</a></li>
<li><a href="http://dev.ariel-networks.com/blog/hamagishi.php?blogid=7">はまぎし</a></li>
<li><a href="http://dev.ariel-networks.com/blog/tsukamoto.php?blogid=9">つかもと</a></li>
<li><a href="http://dev.ariel-networks.com/blog/shiraishi.php?blogid=13">しらいし</a></li>
<li><a href="http://dev.ariel-networks.com/blog/?blogid=19">さかい</a></li>
<li><a href="http://dev.ariel-networks.com/blog/mizuno.php?blogid=20">水野</a></li>
<li><br/></li>
<li><a href="/blog">トップに戻る</a></li>
<li><a href="/">エリアに戻る</a></li>
</ul>
<!-- 
 <h2>Recent Comments</h2>
  

<a href="xml-rss2.php?itemid=613">werrrr</a> says rret...<br><br><a href="xml-rss2.php?itemid=613">ただいま</a> says 。。。...<br><br><a href="xml-rss2.php?itemid=588">lodo4ka</a> says HI! I love this place!...<br><br><a href="xml-rss2.php?itemid=588">peto4ok</a> says Best site I see. Thanks....<br><br><a href="xml-rss2.php?itemid=681">咳</a> says む。Rinda載ってたんですか? Lindaかしら。...<br><br><a href="xml-rss2.php?itemid=709">井上</a> says &gt; アセンブラで書くことを覚えると...[snip]

やはりベテランの意見は参考になります?..<br><br><a href="xml-rss2.php?itemid=709">中山 淳</a> says &gt; フラグの直交性への視点が甘い 

アセンブラで書くことを覚えると、この辺は自然と?..<br><br>
-->

 <h2>コメントとトラックバック</h2>
  <ul class="nobullets"> <li>■<a href="xml-rss2.php?itemid=613#c5113">06-12-12 12:53|werrrr>rret</a></li>
<li>■<a href="xml-rss2.php?itemid=613#c5112">06-12-11 14:40|ただいま>。。。</a></li>
<li>■<a href="xml-rss2.php?itemid=588#c5111">06-06-12 05:49|lodo4ka>HI! I love this place!</a></li>
<li>■<a href="xml-rss2.php?itemid=588#c5110">06-06-07 09:40|peto4ok>Best site I see. Thanks.</a></li>
<li>◆<a href="xml-rss2.php?itemid=710#trackback">05-12-18 18:17|s@s ping: "[書評] 「『P2Pがわかる本』を読みました」"</a></li>
<li>■<a href="xml-rss2.php?itemid=681#c4847">05-12-15 12:55|咳>む。Rinda載ってたんですか? Lindaかしら。</a></li>
<li>■<a href="xml-rss2.php?itemid=709#c4844">05-12-13 21:11|inoue>&gt; アセンブラで書くことを覚えると...[snip]

やはりベ...</a></li>
<li>■<a href="xml-rss2.php?itemid=709#c4843">05-12-13 20:21|nakayama>&gt; フラグの直交性への視点が甘い 

アセンブラで書くこ...</a></li>
<li>■<a href="xml-rss2.php?itemid=709#c4841">05-12-09 22:56|fukushima>ペアプログラミングにもメリットはあるんでしょうが、ペアプ...</a></li>
<li>◆<a href="xml-rss2.php?itemid=709#trackback">05-12-09 09:58|yoosaki@XAAの日記(開発日記とか) ping: "ペアプログラミング"</a></li>
 </ul>  

 <h2>ログイン</h2>
 <a id="nucleus_lf"></a>
<form method="post" action="#nucleus_lf">
  <div class="loginform">
  
  	
  
	<input type="hidden" name="action" value="login" />
	<label for="nucleus_lf_name" accesskey="l">ユーザー名</label>: <input id="nucleus_lf_name" name="login" size="10" value="" class="formfield" />
	<br />
	<label for="nucleus_lf_pwd">パスワード</label>: <input id="nucleus_lf_pwd" name="password" size="10" type="password" value="" class="formfield" />
	<br />
	<input type="submit" value="ログイン" class="formbutton" />
	<br />
	<input type="checkbox" value="1" name="shared" id="nucleus_lf_shared" /><label for="nucleus_lf_shared">このPCを他の人と共用する</label>
  </div>
</form>
 <ul class="nobullets">
  <li><a href="http://dev.ariel-networks.com/blog/nucleus/">管理画面</a></li>
 </ul>
</div>

</body>
</html>