3/29 (土)
新横浜駅にキュービックプラザがオープン (公式)
Permlink
新横浜駅に 3/26 に駅ビル「キュービックプラザ」がオープン。 オープン日には人が多すぎて気後れしたが、 三日目となった今日は会社のお昼休みに出かけてみる。
目的は8Fの三省堂。 広さは神保町の三省堂の2F分ぐらい。 狭くなった渋谷の Book 1st よりは品揃えはよいので、 これからは本を買いに東京方向に出なくてよくなるのが∩(・ω・)∩です。
とりあえず今日のところは何も買わずに、 会社に戻って仕事を続ける…
3/10 (月)
[備忘録] 水道料金を払った
Permlink
12月・1月分の水道料金の支払い伝票を紛失して困っていたのだが、 区役所の水道コーナーで支払えるらしい。
午前中はお休みにして武蔵中原区役所まで支払い行った。 とりあえず水道を止められる事態は回避…
3/3 (月)
[Prog] libunwind-ia64 の実行速度
Permlink
開発中のランタイムシステムに一種の例外機構を実装したいため、 シグナルハンドラからスタックの底にあるフレームを検査したり書き換えたりする必要に迫られている。 IA-64 でスタックフレームの操作を行いたい場合、 libunwindというライブラリがあり、 以前から少しづつ調べていたのだが (2006年8月31日、 2006年9月4日、 2007年12月8日)、 libunwind ライブラリは意外に遅いということにようやく気づいた。
下のようなプログラムの場合、 シグナルを生成して siglongjmp で戻ってくるまでに 1.4GHz の Itanium2 (Montecito) で約 2 マイクロ秒掛かっているのだが、 libunwind を使ってスタックフレームを巻き戻そうとすると 3 倍の時間がかかる。
#include <stdio.h> #include <stdlib.h> #include <signal.h> #include <stdint.h> #include <setjmp.h> #define UNW_LOCAL_ONLY #include <libunwind.h> enum { REPEAT = 10000000 }; static sigjmp_buf buf; uint64_t ia64_get_itc(void) { uint64_t res; __asm__ __volatile__("mov %0=ar.itc" : "=r"(res) :: "memory"); return res; } static void signal_handler(int sig, siginfo_t* sig_info, void* sig_data) { unw_cursor_t cursor; unw_context_t uc; unw_word_t bsp; #if 0 unw_getcontext(&uc); unw_init_local(&cursor, &uc); while (unw_step(&cursor) > 0) { unw_get_reg(&cursor, UNW_IA64_BSP, &bsp); } #endif siglongjmp(buf, 1); } int main() { int i; struct sigaction act; sigemptyset(&act.sa_mask); act.sa_sigaction = signal_handler; act.sa_flags = SA_SIGINFO | SA_RESTART; if (sigaction(SIGSEGV, &act, NULL)) { perror("sigaction error"), exit(1); } uint64_t before = ia64_get_itc(); for (i=0 ; i<REPEAT ; i++) { if (sigsetjmp(buf, 1)) { ; } else { *(int*)0 = 1; } } uint64_t after = ia64_get_itc(); printf("%ld\n", (after - before) / REPEAT); return 0; }
時間(マイクロ秒) | |
---|---|
シグナル送信 + siglongjmp だけ | 1.9 |
追加でスタックフレームを検査 | 6.1 |
マイクロ秒単位の時間なので通常の使い方では問題にならないだろうが、 1秒間に数千回の呼び出しがあると考えると消費時間が馬鹿にならないナリ。