せっかちな人々(まったりも可)
どんなささいなことでも構いません.
面白い最適化のアイデアがありましたら書き込んで下さい.
無論雑談も大歓迎です.

 name :  
 subject : Q. 33 + 17 =
 comment : (i, sub, sup tags are available.)
  
 delete key :
Back To Home

206_ .Xbyak
0x7C . 2012 4/28(Sat) 13:32
こんにちは。Xbyakをダウンロードして遊んでみました。
そして気になった点を書いておきます。(for 3.51)

1.mingw-gcc4.6.1においてxbyak.hの828行目で_snprintf_sが無いというエラーが出る。
 とりあえず#ifdef _MSC_VERにして対処しました。
 もしかすると自分が何かミスしているのかも知れません。

2.align(1)がエラーになる。
 Xbyakの実装を意識する必要性が出てくる?。

3.align(8KB)でアライメントを合わせたとしても次のgrowで4KBアライメントに
 戻ってしまう場合がある。これは単に4KBアライメントでのgrowでは8KBアライメントは
 維持できないからです。

4.ある条件でalign()が止まらなくなる。
 再現コードと対処法 -> http://ideone.com/2fXMS
 これで3も解決するはずです。

5.詳しくないので適当ですが、ページ属性付与はページサイズ毎にしか出来なかった気が
 するので4MB/pageとかだと他のnewの領域まで実行属性が付与されて危険かも。
 例えば4MB/pageの時、top_=0x5000でsize_=0x1000だとすると0x0〜0x4FFFと
 0x6000〜4MBにも属性が付与されます。
 またアロケータから渡されるメモリのページサイズが動的になりうる(Windowsの場
 合VirtualAllocの引数でラージページが使えるらしいです。Linuxは分かりません。
 またCランタイムがどれを使ってくるのかも分かりません)のでCodeArray側でページ属性を
 勝手に変えるのは良くないです。

 解決策としては実行属性が付与されたメモリをアロケータからもらう様にして、CodeArray側で
 は一切属性を変更しないのが良いと思います。Allocatorクラスはインタフェースだけにして、
 それを継承したDefaultAllocatorをCodeArrayのデフォルトにしてDefaultAllocatorは
 内部でHeapCreateやmmapを呼べば良いと思います。メモリ効率改善はユーザーに任せましょう。

もしいろいろ間違ってたらすみません。
 [207]Re:Xbyak
へるみ . 2012 4/30(Mon) 5:57
アドバイスありがとうございます.

>1.
またやらかしてましたか.修正します.

>2, 3, 4
確認します.

>5
ページがまたがってるときにそれを含む部分に実行属性を付与するのは仕様です.
メモリページサイズが動的になるケースは知りませんでした.

後方互換性の点からCodeArray側でページ属性を変えないようにするのは難しいです.

>メモリ効率改善はユーザーに任せましょう。

そういう場合はCodeArray(<userPointerSize>, <userPointer>);を使ってもらえればよいかな.
Allocatorクラスはもう少しちゃんと設計すべきだったとは思います.
こちらはまだ作ったばかりのクラスなのでちょっと考えます.
 [208]Re:Xbyak
へるみ . 2012 4/30(Mon) 6:51
1> mingw
cygwinのgcc 4.3.2だと_sn_prinf_sはありました.ややこしい.
 [209]Re:Xbyak
へるみ . 2012 4/30(Mon) 14:45
>3, 4
テストコードありがとうございます.現象を確認しました.
ただgrowが4096単位でしかalignしてないので本質的にそれ以上のものは保証できないですね.
#ある瞬間にalign 8192したとしてもその後のgrowで変わる可能性がある.
というわけで,grow時はalignを4096までしか指定できないようにするぐらいしか手はなさそうです.

204_ .gcc VC++
gccski . 2011 11/3(Thr) 4:21
gccの入門者です。2つ質問が御座います。
1.VC++を使わず、gccを使う意味は有るのでしょうか。
2.MinGWを使っているのですが、stlのプログラムがコンパイル出来ません。
プログラムは、
#include <stdio.h>
#include <vector>
using namespace std;
int main(){
vector<int> numbers;
numbers.push_back(1);
numbers.push_back(2);
printf("%d\n",numbers[0]);
return 0;
}
です。
$ gcc -c vector_test.cppは実行できました。
$ gcc -o vector_test vector_test.oはエラーが発生します。

どなたか宜しくお願い致します。
 [205]Re:gcc VC++
herumi . 2011 11/3(Thr) 8:25
>1
VC++はWindows以外では動かないですね.

>2
gccではなくg++を使えばよいと思います.

202_ .Windowsのwritevとreadv
Egtra . 2011 7/14(Thr) 23:33
Windowsの場合、ソケット相手なら、WSASend, WSARecvが使えます。これの引数がwritev, readvのようにまとめて読み書きできるようにできています(WSASendTo, WSARecvFromも引数が同様の構成になっており、UDPも可)。

ぱっと見た感じ、Boost.Asioでも使われているようです。boost/asio/detail/win_iocp_socket_service_base.hppのwin_iocp_socket_service_base::async_send内で、start_send_op関数を呼んでおり、ここで引数としてbufs.buffers(), bufs.count()を渡しています。win_iocp_socket_service_base::start_send_op (win_iocp_socket_service_base.ipp)ではそれをそのままWSASendに渡しています。WSARecvその他も同様と思います。

ほか、TransmitPacketsという関数もあるみたいですが、こちらは使ったことないのでよく分かりません(sendfile的な機能を取り込んだ感じ?)。

ディスク相手だと、ReadFileScatter, WriteFileGatherというのがあるにはあるのですが、FILE_FLAG_NO_BUFFERING必須かつバッファサイズはページファイルサイズ単位という、汎用的に使えるようなものではないです。
http://support.microsoft.com/kb/160606/en-us
 [203]Re:Windowsのwritevとreadv
へるみ . 2011 7/15(Fri) 10:01
おお,本当ですね.
前コードを追っかけていたときはどこを見ていたのだろう.恥ずかしい限りです.
ご指摘ありがとうございました.

198_ .redefine?
dsk . 2010 8/6(Fri) 0:30
int main(int ac, char *av[]) {
 for(int i = 1;;) {
  int i = 2;
  std::cout << "i = " << i << std::endl;
  return 0;
 }
 return 0;
}


「2 」と表示されました@ちと古めのgcc4.01/4.20。
 [199]Re:redefine?
へるみ . 2010 8/6(Fri) 6:49
gccはfor ()があると強制的に{}を仮想的に中に作るんでしょうね.

for (int i = 0; i < 2; i++)
for (int i = 0; i < 2; i++)
for (int i = 0; i < 2; i++)
for (int i = 0; i < 2; i++)
printf("%d\n", i);
が通りましたから.
 [200]Re:redefine?
dsk . 2010 8/6(Fri) 10:35
ifやforが{}を仮定されるのはC99の有名な仕様(仕様変更)ですよね。c++0xで採用されるのかどうかは知りませんが…。すなわち

if(c) a;
if(c) a; else b;

と書けば

{ if(c) { a; } }
{ if(c) { a; } else { b; } }

と解釈される。enumを使った例でC99かどうかで答が変る例が有名ですね。
これからすると、上記は
{ for(...) { {for(...) { {for(...) { { for(...) { printf(...); } }} }} }} }
となってC99だと仕様上通ることになりますね。
 [201]Re:redefine?
dsk . 2010 8/7(Sat) 22:39
8/6の日記に関して、

while (int i = 0) {
 int i = 0;
}



for(; int i = 0; ) {
 int i = 0;
}

相当で、実際こう書くとgccでもredefineのエラーになります。なので標準仕様との乖離は別として一貫した仕様ではあると思います。両方ともOKなのが標準仕様なんですかね。すなわち、
for(int i = 0; int j = 0; ) {
 int i = 1;
 int j = 1;
}
とかもOKになるということ。

184_ .
kikx . 2010 7/2(Fri) 20:52
ぱっとみ、ルベーグ可測→ルベーグ可積分になおさないといけないんだけれども、

この形で極限をいれかえて f(y) -> 0 をいうには、
0の近傍Vと可積分関数gが存在して、任意のx∈[0,1]とy∈Vに対して
|f(x+y)| < g(x)
でないといけないので、これはもう連続じゃないとつらくって

ちょっと置換積分して、積分区間が[0,1]に収束するようにしてやれば、ルベーグ積分の積分区間に関する連続性からできると思う
 [185]Re:
kikx . 2010 7/2(Fri) 20:56
[0,1]で有界だと可測とかなしに連続が出てこないかな、有界線形作用素のときみたいに。試してないけど
 [186]Re:
kik . 2010 7/3(Sat) 5:44
可測でもできるかなあと思って考え直してたら、大変な勘違いに気づいちゃった

|f(y)| = |f(x+y)-f(x)|
任意のM>0にたいして
min(|f(y)|,M) = min(|f(x+y)-f(x)|,M)
∫_0^1 min(|f(y)|,M) dx = ∫_0^1 min(|f(x+y)-f(x)|,M) dx
min(|f(y)|,M) = ∫_0^1 min(|f(x+y)-f(x)|,M) dx
これで、0 ≦ min(|f(x+y)-f(x)|,M) ≦ M で一様に抑えられてるから
lim_y min(|f(y)|,M)
= lim_y∫_0^1 min(|f(x+y)-f(x)|,M) dx
= ∫_0^1 min(lim_y |f(x+y)-f(x)|,M) dx あれ?
ここまで手でやってみるまで、議論がループしてるのに気づかなかった…

やっぱり、f が可積分で、m(An)→0 ならば lim∫_An f → 0 を使わないとだめっぽいです
 [187]Re:
へるみ . 2010 7/3(Sat) 8:41
コメントありがとうございます.
うーん,単純にLebesqueの定理使おうとすると条件が厳しすぎましたか.
岩波の数学辞典(4版, 340 特殊関数方程式)見ると,この関数の連続性という条件は,
・1点での連続性,
・可測性,
・ある測度正の集合上で上または下からの有界性
で置き換えられる,とありました.有界性からだけでもでるみたいですね.
可測性の詳しい説明は無かったです.
 [188]Re:
kik . 2010 7/4(Sun) 5:47
(2)→(3)はできるんじゃないかな。
lim_{M→∞} m(f < M) = ∞
だから、どっかの M に対して、 m(f < M) > 0 になるはずはず。

測度正の集合って開集合を含むんだっけなあ。自信ない。でも、それなら終わってるな。
 [191]Re:
へるみ . 2010 7/6(Tue) 19:18
>測度正の集合って開集合を含むんだっけなあ

X = [0,1] - Qは測度正だけど開集合を含んでないような気がしますが,またポカしてる可能性大(^^;
 [192]Re:
kikx . 2010 7/7(Wed) 19:06
開集合はどうも含まなさそうだし、(3)→(1)は全然わからないです。
可測関数っていう条件すらなくなって、これはどうすりゃいいんでしょうねえ
 [193]Re:
へるみ . 2010 7/8(Thr) 4:23
確か『解析問題ゼミ』(シュプリンガー)には載ってた気がするので夏休みに実家に戻れたら探してみます.
 [194]Re:
kik . 2010 7/9(Fri) 0:40
もうさっぱり分からないので答えさがしてたら、
http://www.jstor.org/pss/2033904
によると[4]と[5]に載ってるらしいんだけど、論文読める環境ないので停止中です。
http://www2.math.kyushu-u.ac.jp/~ssaito/eng/maths/Cauchy.pdf
これのシエルピンスキーの証明みたいな感じになるのかなって気はしてるんだけど、さっぱり分からない
 [195]Re:
へるみ . 2010 7/9(Fri) 7:17
2033904の論文は私も探して見つけたけど同じく読めないです.
 [196]Re:
kik . 2010 7/24(Sat) 16:35
答え見ました。
http://en.wikipedia.org/wiki/Steinhaus_theorem
この定理を使うだけでした。定理の証明も簡単なのにすごい
 [197]Re:
. 2010 7/25(Sun) 11:17
ありがとうございます.あとで見ます.

189_ .お久しぶりでした
y-shindoh . 2010 7/4(Sun) 22:27
今日は久々にお会いできて、嬉しかったです。
大阪に残っている方々とは、関西出張の機会にお会いすることが出来るのですが、
逆に、関東にいらっしゃる方とは、お会いすることがなかなかなかったりします。
またお会いする機会もあるかと思いますが、
その時はもうちょっと近況報告とか出来れば良いですね。
 [190]Re:お久しぶりでした
へるみ . 2010 7/5(Mon) 7:00
本当にお久でした.
大阪の人たちともどもまたお会いしたいですね.

180_ .
. 2010 5/28(Fri) 7:27
http://homepage1.nifty.com/herumi/diary/0604.html#26

>>ところが実際やってみると, VC++では最適化が邪魔してなかなか思い通りの挙動を示してくれない。
というよりvolatile付けて無いだけ。

InitStack、GetStackSizeの両方の定義
> int p[SS_ARRAY_NUM];

> volatile int p[SS_ARRAY_NUM];
これ知らないとマルチスレッドプログラミング出来ない。

あとInitStack、GetStackSize両方とも配列サイズずれる可能性あるから

inline void InitStack()
{
...
}
inline int GetStackSize()
{
...
}
int main()
{
size_t size = 0;
InitStack();
fib(10);
size = GetStackSize() + sizeof(size);
printf("size=%d\n", size);
}
 [183]Re:
. 2010 6/23(Wed) 1:00
>pragmaやvolatileなどいろいろ試したけど

181_ .sieve
kik . 2010 6/18(Fri) 1:50
だれもが通る道らしいですよ:D
http://d.hatena.ne.jp/camlspotter/20100128/1264678903
 [182]Re:sieve
へるみ . 2010 6/18(Fri) 6:58
それを聞いてちょっと安心しました(^^;

177_ .gcc4.5onIA32
とみながたけひろ . 2010 4/17(Sat) 18:13
>On x86 targets, code containing floating-point calculations may run
>significantly slower when compiled with GCC 4.5 in strict C99 conformance
>mode than they did with earlier GCC versions. This is due to stricter
>standard conformance of the compiler and can be avoided by using the option
>-fexcess-precision=fast

だそうなんで、-fexcess-precision=fastオプションがないと絶望するほど遅いです。
 [178]Re:gcc4.5onIA32
へるみ . 2010 4/17(Sat) 18:19
なるほど.ありがとうございます.VCの/fp:fastみたいなもんですかね.ただペアリングの方は浮動小数点数使ってないのでどうかな.とにかく試してみます.
 [179]Re:gcc4.5onIA32
へるみ . 2010 4/17(Sat) 18:39
試してみましたが,やっぱり変化はありませんでした.残念.
個人的にはstrict aliasing系で何か失敗しちゃった(私のせいも含む)のかなと思ってます.warningは出てないんですけどね.

174_ .exp
とみながたけひろ . 2009 11/12(Thr) 1:13
私の書いた実装ってどうなってたっけ、と見てみると、Pade近似でした。
exp.cppでいうところのfloat d = x - n;に対して、0<d<1/8となるまでdを1/2し、その値に対してPade近似、1/2した回数に応じて結果をべき乗、というコードでした。またexp(x)=(2^a)*(e^b)の形に変換してaの項から指数部を直接計算してるのでnに関してのテーブル引きはやってません。

が、メモリ使っていいならテーブルが有利そうですねえ。Pade近似は割り算いるし。
 [175]Re:exp
へるみ . 2009 11/12(Thr) 21:34
テーブル引きも結構重たし,SIMDしにくいのであまり好きじゃないのですが,今回は安易にPade近似に走らないようにしてみました(笑).実際のところ8次までのローラン展開を計算する部分だけで今回のやつより遅くなっちゃう感じです.

#ところでおめでとうございます.
 [176]Re:exp
seizh . 2009 12/9(Wed) 17:56
fmathの対応ありがとうございます。

Cygwinでのビルドですが、Xbyakにおける例の箇所だけ修正すれば特に
動作上問題ありませんでした。以下、私の環境での計測結果です。

・Core 2 Quad Q9550
・Windows XP SP3
・gcc version 4.3.2 20080827 (beta) 2 (GCC) i686-pc-cygwin

32bit gcc 4.3
useSSE41=1, verifyAll=0
fmath::exp max=4.768372e-07, abs ave=9.176717e-08 ave=9.900496e-09 max=0.000000
fmath::pExp max=4.768372e-07, abs ave=9.176717e-08 ave=9.900496e-09 max=0.000000
range=[0.00, 2.00], d=1.000000e-06, N=30
std::exp sum=4473924.500000 ave=143.022clk(x1.00)
fmath::exp sum=4473924.500000 ave= 17.807clk(x8.03)
fmath::pExp sum=4473924.500000 ave= 13.747clk(x10.40)
range=[0.00, 4.00], d=1.000000e-05, N=30
std::exp sum=5207314.500000 ave=160.378clk(x1.00)
fmath::exp sum=5207314.500000 ave= 17.743clk(x9.04)
fmath::pExp sum=5207314.500000 ave= 13.765clk(x11.65)
range=[0.00, 20.00], d=1.000000e-05, N=30
std::exp sum=48480538066944.000000 ave=175.139clk(x1.00)
fmath::exp sum=48480538066944.000000 ave= 17.731clk(x9.88)
fmath::pExp sum=48480538066944.000000 ave= 13.739clk(x12.75)
range=[-1.00, 0.00], d=1.000000e-06, N=30
std::exp sum=559240.562500 ave=107.843clk(x1.00)
fmath::exp sum=559240.562500 ave= 17.845clk(x6.04)
fmath::pExp sum=559240.562500 ave= 13.795clk(x7.82)
range=[-10.00, 0.00], d=1.000000e-05, N=30
std::exp sum=95631.367188 ave=171.428clk(x1.00)
fmath::exp sum=95631.367188 ave= 17.614clk(x9.73)
fmath::pExp sum=95631.367188 ave= 13.739clk(x12.48)

単一データに対する並列化は確かにやりにくそうですが4並列とか8並列なら
それなりに需要はあるかと思います。
たとえば Intel Compilerの ___m128 __cdecl _mm_exp_ps(__m128 x); みたいな

172_ .科学未来館の入館料
Egtra . 2009 10/30(Fri) 9:29
へるみさんは払戻し受け付けてもらえたんですね。自分も以前とあるイベント(?)で科学未来館に行ったことがあり、やはり、あとで入館料が不要だったことを知った口です。そのときは払い戻されませんでしたが、よく思い出してみれば、そっちの係員に相談しただけで諦めてしまっていました。入口で払戻しを要求すれば良かったんですかね。もちろん、1番良いのは買う前に気付くことですが。
 [173]Re:科学未来館の入館料
へるみ . 2009 10/30(Fri) 11:21
私の場合は,その券が本当に未使用なのか(入館料が必要なブースに入っていないか)バーコードでチャックされてOKが出て返金されました.一枚一枚管理してるんだなあと思ったのですが,もしかしたらEgtraさんのときはまだそういうシステムが無かったのかもしれませんね(あるいは単に係員が知らなかっただけか).

170_ .文字エンコーディングについて
メロンアイス . 2009 8/22(Sat) 13:38
ちょっと浮動小数の格納形式を確認しに来たのですが、
http://homepage1.nifty.com/herumi/adv.html
このページが、Firefox3.5.2で文字化けします(UTF-8を指定すれば見られる)。
ソースではcharset=Shift_JISとされていますが、実際はUTF-8ではないでしょうか?
 [171]Re:文字エンコーディングについて
herumi . 2009 8/22(Sat) 14:41
ご指摘ありがとうございます.先日Shift_JISからUTF-8に変更したとき修正し忘れていました.

168_ .
. 2009 8/19(Wed) 5:13
http://homepage1.nifty.com/herumi/prog/gcc-and-vc.html#ATOMIC

{ tmp = *p; *p += v; return tmp; }
と同等のものには{,_}InterlockedExchangeAddが有ると思います
 [169]Re:
へるみ . 2009 8/19(Wed) 9:58
ご指摘ありがとうございました.
手元で試していたときはその関数のテストをしていたのですが,表にするときに抜けてしまったようです.

166_ .template関数
dsk . 2009 2/8(Sun) 8:21
#include <cstdio>

template <typename T> void func0(T t) { puts("func0(T)"); }
template <typename T> void func0(T* t) { puts("func0(T*)"); }
template <> void func0<>(int* i) { puts("func0(int*)"); }

template <typename T> void func1(T t) { puts("func1(T)"); }
template <> void func1<>(int* i) { puts("func1(int*)"); }
template <typename T> void func1(T* t) { puts("func1(T*)"); }

int
main() {
int *p = 0;
func0(p);
func1(p);
return 0;
}

===========実行結果===========

func0(int*)
func1(T*)


これは規格通りの動作だそうです。
という訳で、templateからむと定義順序と結果が関係してくるのですね。
ポイントは
1. func0()/func1()の2番目の定義は、1番目の定義に対するpartial specializationではなく
(C++ ではfunction templateに対するpartial specializationは存在しない)
単なるoverloadである。
2. template関数の(partialでない)specializationはoverloadしない。
3. func0<int*>はfunc0<T*>のspecializationであり、func1<int*>はfunc1<T>のspecializationである。
 [167]Re:template関数
へるみ . 2009 2/18(Wed) 14:48
定義順序に依存するというのはどこかで見たことがあったので探してたのですが見つかりませんでした.どこだっけかな.
他には名前空間が入ったときの定義の仕方もよく間違えてしまいます.

名前空間Aに定義したtemplate関数
namespace A {
template<typename T>void func(const T&) {}
}

の特殊化は
template<>
void A::func<int>(const int&) {}
ではなく
namespace A {
template<>
void func<int>(const int&) {}
}
でないといけない.VCだとどちらでもOKだが,gccは前者はアウト.
普通の関数だとどちらでもいいのに変だなあ.

namespace A {

void func();

}

void A::func() { } // gcc でもOK
//namespace A { // こちらでもOK
//void func() { }
//}

int main()
{
A::func();
}

165_ .pythonのraw string
dsk . 2008 10/23(Thr) 22:39
本当だ、仕様なんですね。
http://docs.python.org/dev/reference/lexical_analysis.html#string-literals

正確には、奇数個のバックスラッシュで終るとNG、偶数個ならOKですね。だけど仕様のバグのような気がする...。

162_ .配列とコピーコンストラクタ
dsk . 2008 10/17(Fri) 6:31
privateでなくてもexplicitでもエラーですね。
オブジェクトの配列を作るときには「そのクラスのコピーコンストラクタを必要とする」んだったような気が...。
stl使ってるときにもコピーコンストラクタをexplicitやprotectedにしてエラーになることが良くあるように思います。
 [163]Re:配列とコピーコンストラクタ
へるみ . 2008 10/17(Fri) 10:04
現状のC++のSTLは値渡しなんでコピーコンストラクタが呼べないとエラーになるのはわかるんですが(実際呼ばれますし),このケースでは呼ばれてないのに必要なのがちょっとひっかかりました.
 [164]Re:配列とコピーコンストラクタ
dsk . 2008 10/18(Sat) 19:12
stlの場合でも(コピーコンストラクタじゃなくて他のコンストラクタだったかも知れませんが)呼ばれてないのに必要なことがあったと思います。
C++になってから暗黙で呼ばれるメソッドや呼ばなくても必要とするメソッドとかが沢山増えて(それだけ言語として強力であるとも言えますが)エラーで悩むことが多くなったと思います。

シングルトン作るときとか、特定のパターンでコンストラクタをpublicでなくしますがそれ以外は主要なメソッドは大方publicにしますね。

159_ .Reverse engineering コンテスト
dsk . 2008 9/25(Thr) 19:28
結果だけ見たのですが、どれもstripされていないようでlevel4ならstringsで
Blowfish_Encrypt
Blowfish_Decrypt
Blowfish_Init
とかが見えるのですが、これらは囮なんでしょうか?
 [160]Re:Reverse engineering コンテスト
へるみ . 2008 9/25(Thr) 23:11
どうなんでしょうねぇ.ヒントなのは間違いないと思いますがlevel3なんかを見ると一筋縄ではいかなさそうです.
level2のMD5も微妙にずらしてましたし.
 [161]Re:Reverse engineering コンテスト
dsk . 2008 9/30(Tue) 13:11
実機がなければGBAのエミュレータ付き開発キットあたりが便利か。

152_ .Problem28と
dsk . 2008 8/28(Thr) 19:06
f(x + y) = f(x) + f(y) for all x, f(1) = 1 ⇒ f(x) = x ーーー ★
は本当に似たようなものでは?式の形よりもQじゃなくてRでることが本質で、Problem28もRだと証明できないと思う(Problem30はRで出来るから本質的にProblem28とは違う感じ)。

ところで、★の反例ってどうやって構成する? x〜y ⇔ x-y∈Q と定義して M = R/〜 (Rの部分集合からなる集合)を考えて選択公理から各X∈Mの代表元x∈Xからなる集合Nを考えることができる。あとはNの元にうまく関数値をアサインするんだろうけど、ここから先がうまくいかないです^^;
 [153]Re:Problem28と
へるみ . 2008 8/29(Fri) 10:32
う,3回生の演義でやってただけなので詳細は覚えてません(^^; fが可測ならlinearになるという事実はあったと思います.

>★の反例ってどうやって構成する?

こんな感じでどうでしょう.
f|Q = id
x_0∈R - Qをとり,S_0 := Q + (Q_>0)x_0,f(x0):=y0 != x0としてfをS_0に拡張.これはlinearでない.
x_1∈R - S_0をとると,(Q_>0)x_1 ∩ S_0 = Φで,S_1 := S_0 + (Q_>0)x_1にfを拡張.
以下同様.{S_i}は帰納的順序集合なのでZornの補題により極大元をSをもつ.
S != Rならx ∈ R-Sをとることで矛盾がでるのでS = R.
 [154]Re:Problem28と
dsk . 2008 8/29(Fri) 12:16
なるほどボトムアップに構成していってZornの補題ですか。

しかし、中身のS_0の定義が変な気が...。そのままだとx_1 = -x_0∈R-S_0とすると
0 = f(0) = f(x_0+x_1) = f(x_0) + f(x_1) = y_0 + y_1 となってy_1 = -y_0と選ばないと駄目で条件が付いてしまうので証明が面倒になるのではないでしょうか?

S_0 := Q + Qx_0 = {a + bx_0 | a, b ∈Q }として
x_1∈R-S_0をとると Qx_1 ∩ S_0 = {0} だから S_1 := S_0 + Qx_1にfを拡張可能。
 [155]Re:Problem28と
へるみ . 2008 8/29(Fri) 22:55
何を思って>0の条件をつけたんでしょうね(人ごと).
結局はRを無限次元Qベクトル空間と見たときの基底Λから1とx_0(!=Q)をとって
f(1):=1, f(x_0)=2, 他の基底については全て0にでもして拡張すればOKということなのかな.
そんな簡単だったっけかなあ.
 [156]Re:Problem28と
dsk . 2008 8/31(Sun) 22:04
基底Λが取れることが本質だと思います。基底の存在は選択公理(Zornの補題)がないと言えないはずで、先の証明も基底が取れると言うことを証明しているのに近いかと思います。
基底Λさえとれれば、f(1):=1, λ∈Λ\{1}でf(λ) = 0としてOKで、それは先の証明では常にy_i = 0としてfを拡張することに相当すると思います。
 [157]Re:Problem28と
へるみ . 2008 9/1(Mon) 11:33
>f(1):=1, λ∈Λ\{1}でf(λ) = 0としてOKで
そうですね.本当は最初そうやって作ったのですが,「これだとf|Q = id, f|R-Q = 0となってしまって明らかにおかしいよなあ」とおもいっきり勘違いしたのでした.で,それから最初に書いたのQ_>とかいう,わけわかめな方向に走ってたのでした.
 [158]Re:Problem28と
dsk . 2008 9/1(Mon) 17:40
実は選択公理の仮定のもとに、「任意のベクトル空間は基底を持つ」が成立するんですね。
# 基本事項っぽいですが、知ってたら悩まなかったのに...。
これまでBanach空間じゃない(無限次元の)空間を殆ど扱ったことがないので(しかも殆どの場合はseparableな場合のみ)基底が存在する状態からスタートしていた訳で、R/Qみたいな変な空間が現われたら駄目ですね...。

146_ .@b, @f問題
dsk . 2008 5/31(Sat) 0:54
関数越えはエラーにする、というのは駄目ですか?
・ループや分岐を楽に書く
・ループや分岐を含むマクロを書いておいて展開する
のが目的ですよね。
 [147]Re:@b, @f問題
へるみ . 2008 6/1(Sun) 7:06
>関数越えはエラーにする、というのは駄目ですか?

駄目じゃないですけど,Xbyak自身に「関数越え」を認識させるのが問題なわけです.
そのためには__func__的マクロをうまく使うか,実行時のスタックトレースを追っかけるか(大げさすぎるのでやらない)ぐらいしか思いつかないです.
 [148]Re:@b, @f問題
dsk . 2008 6/5(Thr) 11:50
関数の順序が保証されない問題だと勘違いしてました...。

スタティックな変数function_noを持っておき、
関数定義(code gen)の度にインクリメントし、
@@,@b,@fのラベルにはfunction_noの値も埋め込む

という実装じゃだめですか?
 [149]Re:@b, @f問題
dsk . 2008 6/5(Thr) 12:05
すいません。そのままじゃMT_SAFEにならないですね。
function_noをthread毎に持つとか。

重いならその辺りはユーザに選択させるような実装にするとか。
・@@を使うのでcode genの前に同期する(function_noをincrementする)
・@@を使わない/範囲外の@b,@fを使わないことについてはユーザが責任を持つので
code genの前に同期しない(function_noをさわらない)
・MTを使わないので同期せずにfunction_noをincrementする。
 [150]Re:@b, @f問題
へるみ . 2008 6/6(Fri) 15:00
コード生成時にスレッドセーフにする必要はないと思いますが,

>スタティックな変数function_noを持っておき、
>関数定義(code gen)の度にインクリメントし、
>@@,@b,@fのラベルにはfunction_noの値も埋め込む
>
という実装でも

void func()
{
    L("@@"); // A
    ...
    jmp("@b");
}

というコードを

L("@@"); // B
func();
jmp("@b"); // C

CでAじゃなくBにジャンプできるように作るのは大変なのでは,という話です.

>ユーザに選択させるような実装にするとか
まあ,その付近が落としどころなんでしょうが,文法が増えるのをできるだけ減らしたいんですよね.
 [151]Re:@b, @f問題
dsk . 2008 6/6(Fri) 15:12
あら、ものすごく勘違い。中のfunc()の際にcode genが呼ばれないですね...。だからスタック追い掛ける話になってたのか...。失礼しました。

141_ .busy loop
dsk . 2008 5/21(Wed) 15:42
速度クリティカルな間だけ、busy loopにすれば使えるのではないでしょうか?

<スレッドを叩き起す。>
for(<10万回のループ) {
 <5/20の日記のコード、ただしスレッドを眠らせる機能を追加したものを利用>
}
<スレッドを眠らせる。>

とか。
 [142]Re:busy loop
へるみ . 2008 5/21(Wed) 22:24
そうですね.まあもともと1msec未満で計算終了なんでスレッドをたたき起こす時間ももったいなかったりします.というわけでネタにしかならんだろうなあ.
 [143]Re:busy loop
dsk . 2008 5/23(Fri) 10:59
あ、ペアリングの高速化の話だったんですね。PC版は現状でもういいような気が。すなわちネタですね。

ですが、携帯とかプアなプロセッサ上では「1msec未満で計算終了」とは行かないだろうからネタよりも意味があると思います。
その場合は電池の消耗の問題があるからビジーループは出来るだけ避けたい、というのもあると思うのでスレッドを起こしたり眠らせたりにも意味が出てくる。

ARMとかでの結果が欲しいですね...。ってXbyakをARMに対応させるとこからになってしまうか...。
もうすぐ発売のWillcomのD4がIA32互換だったと思う(Vistaが載るはず)けど、PC並のプロセッサという噂もあるしどうなんでしょう?
 [144]Re:busy loop
とみながたけひろ . 2008 5/24(Sat) 17:19
いまどきの(Linuxとかの)ミューテックスの実装は「何度かビジーループしてそれでも駄目ならカーネルに任せる」みたいな感じらしいので、割とある実装なんじゃないでしょうか。

私が今書いてる環境だとビジーループ中に呼び出し元PC近辺をI$プリフェッチとか、もうじき仕事が終わりそうな時には別スレッド側でフラグを立て、そのフラグが立ってたらビジーループとか、色々やってます。エンジンを空ぶかしという感じ。
 [145]Re:busy loop
へるみ . 2008 5/25(Sun) 21:26
>いまどきの(Linuxとかの)ミューテックスの実装は「何度かビジーループして
>それでも駄目ならカーネルに任せる」みたいな感じらしいので

WindowsのCriticalSectionもそういう実装ですね.

>私が今書いてる環境だと

なかなか渋い環境で開発されてますね.組み込みやゲーム関連(?)だと未だにそういう世界なんですね.

137_ .nasm 2.0 は 64bit 対応済み
eijit . 2008 4/18(Fri) 0:46
去年の末くらいに nasm が 2.0 にメジャーバージョンアップし, 64bit に対応していました. ご存知でしたらすみません.
 [139]Re:nasm 2.0 は 64bit 対応済み
へるみ . 2008 4/18(Fri) 9:31
そうでしたか.情報ありがとうございます.
ということは,nasmとyasmの棲み分けはどうなってるのかしら.
 [140]Re:nasm 2.0 は 64bit 対応済み
へるみ . 2008 4/18(Fri) 10:07
nasm 2.0.2にしたらclflushのテストが通らなくなった.
nasmは0F80を出してるけど,これって0FAEの間違いじゃないかな.yasmもそうなってるし.

133_ .xbyakの文字列出力オプションについて
計 . 2008 4/16(Wed) 21:39
今日はFSIJでオモロい話をありがとうございました。

xbyakついて質問です。
今日の話の中で、xbyakでJITしたコードを、
アセンブラ形式の文字列として出力できる方法があるような感じでしたが、
具体的にどうやるのでしょうか?
 [134]Re:xbyakの文字列出力オプションについて
へるみ . 2008 4/16(Wed) 23:53
ああ,質問はそういう意味でしたか.そっか,だから笹田さんが聞き直してたのか.
完全に勘違いしてました.今のところそういう機能は無いです.すいません.

JITしたコードへのポインタとサイズは取得できるので,それをdb 形式で出力するのなら簡単にできるのですが….
 [135]分岐予測攻撃対策
dsk . 2008 4/17(Thr) 14:28
暗号のside channel攻撃として強力なものの一つに分岐予測攻撃対策にxbyakが使えないかな?と思い付きました。
分岐条件nzとzを乱数で決めてJIT展開する。すなわち毎回異なるコードが動く訳です。単なる思い付きです。
 [136]Re:xbyakの文字列出力オプションについて
dsk . 2008 4/17(Thr) 14:30
日本語になってない。

暗号のside channel攻撃として強力なものの一つに分岐予測攻撃がありますが、その対策にxbyakが使えないかな?
と思い付きました。

です。
 [138]Re:分岐予測攻撃対策
へるみ . 2008 4/18(Fri) 9:30
そうですね,プログラム自体に乱数的なものを入れて攪乱させるというのはありかもしれませんね.

131_ .既約多項式
dsk . 2008 4/7(Mon) 9:59
既存の結果との勝負には勝ったのだから

> log_2(3^97)〜153bit程度→RSA1000bit程度.でもF_3の拡大体には特殊な攻撃があって,RSA500〜700bitぐらいの強さでは?という悲観的な人もいて,bitをもうちょっととらないといかんかもらしい.
なので、次は97次より高くて良い多項式でやるのでは?

# それにしても167次は一気に上がりすぎのような気がするけど。
 [132]Re:既約多項式
へるみ . 2008 4/7(Mon) 11:07
そうですね.167だとSIMDレジスタに入らないので128よりちょっと小さいぐらいで手頃なのがあればよいのですが,中間がないのかなあ.調べてない&考えてないのでわかりません.

125_ .MacOS10.5.2で動かしました
dsk . 2008 3/31(Mon) 18:17
0.267msecだそうです。

# サイトにあるビルド方法(for Linux)だとinclude.mieの中をmakeしてくれないのでは?

OSXだとinclude.mieのmakeは出来無いので、

1. include.mie/x86/nasm.cfg を編集して ADD_UNDERSCORE を on にする
2. include.mieで
nasm -f macho -i./x86 x86/clka.asm -o x86/clka.o
3. timecapsule/engine/pairing/testでmakeできるところまでやって、
最後の -linclude.mie の代りに ../../../../x86/clka.o をlink

とやって動かしました。
 [126]Re:MacOS10.5.2で動かしました
へるみ . 2008 3/31(Mon) 19:45
>include.mieの中をmakeしてくれないのでは?
おお,どうも失礼しました.
ライブラリはデバッグでしか使わないので外しました(3/31版).
そうすればMacでも何もせず動くのですよね.
 [127]Re:MacOS10.5.2で動かしました
dsk . 2008 3/31(Mon) 20:44
3/31版動作を確認しました。make一発でした。
clkputじゃなくて標準のclock()で測ってたんですね....。ソース見ずにmakeの出したエラーしか見てませんでした。今回は、結果は
0.237msec
と先程より劇的に速くなっていますが...(3/28版も実行しましたが、0.266msecで変らず)。
 [129]Re:MacOS10.5.2で動かしました
へるみ . 2008 4/4(Fri) 9:14
>今回は、結果は0.237msec
Core2Duo 2.4GHzでですか? あまり速くありませんね.gccのバージョンはいくつでしょうか.
 [130]Re:MacOS10.5.2で動かしました
dsk . 2008 4/4(Fri) 11:34
% gcc --version
i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1 (Apple Inc. build 5470) (Aspen 5470.3)
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

古いし、アップルの手の入ったgccなので何とも言えないですね...。

128_ .4/3現在
dsk . 2008 4/3(Thr) 14:43
googleでトップのようですが...

お願いが効いたのかな?

123_ .ηペアリング
dsk . 2008 3/10(Mon) 12:41
私のPC(Core2Duo@2.4GHz)で計測するだけで400μsecは切れそうですね。
 [124]Re:ηペアリング
へるみ . 2008 3/10(Mon) 13:04
ええ,Core2Duo 2.66GHzだと350usecです.

111_ .ペンティアムX
a_core . 2008 1/13(Sun) 17:09
ずいぶん昔、雑誌でRISCの最適化の記事を読んだのですが、
分岐命令の直後にnop命令を置くと速く動作するCPUがあるそうです。

試しに、Celeron366MHzで後退分岐ジャンプの直後にnopを置く実験してみたら、
結構、速くなりましたよー。

(旧型マシンしか生きてないので、366だったと思う)
 [113]Re:ペンティアムX
a_core . 2008 1/13(Sun) 17:47
念のため確認しています。m(_ _)m
 [114]Re:ペンティアムX
a_core . 2008 1/13(Sun) 18:25
確認した所、完全なデマである結果となってしまいました。(他人の2.8GHzマシンでも確認)
大変お騒がせしました。
明日の晩に書き込みを消そうと思います。m(_ _)m
 [116]Re:ペンティアムX
へるみ . 2008 1/13(Sun) 21:19
K6-2の頃は,命令を16byte境界をまたがないようにするとストールしないことがあって,そのために命令の合間にnopを入れると速くなることはありましたねぇ.
 [120]Re:ペンティアムX
a_core . 2008 1/17(Thr) 16:09
16byte境界をまたぐとストールですか。
凄い概念ですね、気にも止めていませんでした。

でも何で32byte境界でないのかが気になります。
 [121]Re:ペンティアムX
a_core . 2008 1/19(Sat) 22:45
bitと勘違いしてました。
 [122]Re:ペンティアムX
a_core . 2008 2/22(Fri) 18:46
今年はうるう年だから"366"日(笑

ノートさんのページです、同期処理で参考になります。
http://www.geocities.jp/note_txt/
http://www.geocities.jp/note_txt/sv/YYMMDD.html

112_ .インストーラ作成ですか?
計 . 2008 1/13(Sun) 17:18
既存のインストーラで済まない特殊なインストーラ作成ですか?
 [115]Re:インストーラ作成ですか?
へるみ . 2008 1/13(Sun) 21:08
いえ,インストーラ使うの初めてでして.初歩から調査中なのです.Xp/Vistaでインストール時に自動的に関連づけも行えるフリーのインストーラ作成ツールって何かありますでしょうか.
 [117]Re:インストーラ作成ですか?
計 . 2008 1/13(Sun) 21:38
InnoSetup でどうでしょう?
http://www.jrsoftware.org/isinfo.php

Visat、私自身は、InnoSetup製インストーラをVistaで使ったことは一度もないですが、
対応してるっぽいので。

ちなみに、InnoSetupでの関連付けのやり方
http://www.jrsoftware.org/isfaq.php#assoc
 [118]Re:インストーラ作成ですか?
へるみ . 2008 1/13(Sun) 22:19
ありがとうございます.試してみます.
ところで,遅ればせながら明けましておめでとうございます.
今年もよろしくお願いします.
 [119]Re:インストーラ作成ですか?
へるみ . 2008 1/15(Tue) 17:50
メモ WiXというのもあるらしい.
http://codezine.jp/a/article.aspx?aid=428
あと,VC Prof以降だとVCの配置プロジェクトでも作れる.

110_ .ありゃ,ページが見えない
へるみ . 2008 1/11(Fri) 10:08
家に帰ってから直そう.

108_ .コート
UNA . 2007 12/29(Sat) 20:07
コートなしでどうやって京都の約10年を過ごしたんすか!?私はロングダウンジャケットとか着ても寒くて寒くて死にかけてたのに!やっぱ常に外にいてたらランニングしてるから寒くないんですかねぇ。
 [109]Re:コート
へるみ . 2007 12/30(Sun) 13:49
流石にランニングするときは手袋とジャンパーしてますよ.あと寒いことは寒いです(^^;

107_ .コウコク
a_core . 2007 12/23(Sun) 11:28
以前、ある掲示板で助けられた者です。
その節はご迷惑おかけしました。

最近、ホームページを作りました。
ぜひ一度見に来てくださ〜い。
http://members3.jcom.home.ne.jp/a_core/

105_ .階段
UNA . 2007 12/20(Thr) 22:29
数理解析系の皆様はどうして階段を一気に猛スピードで駆け上がる方が多いのでしょう?不思議。
 [106]Re:階段
へるみ . 2007 12/21(Fri) 9:24
>一気に猛スピードで駆け上がる
今のところはまだ一気に駆け上がれないです.鍛え直しだ(^^;

99_ .ペアリング高速化
dsk . 2007 12/13(Thr) 13:20
何がちがったのでしょうか?
・方程式が違う。
・体が違う。
・アルゴリズムが違う。

#日記の日付が間違っているようです
 [100]Re:ペアリング高速化
へるみ . 2007 12/13(Thr) 18:37
その全部みたいですね.F_3^m(m = 97or 167)上でetaT pairingを使う(行き先は6次拡大体)のが今のところ最速らしいです.キーワード自体は前からあった気もしますが携帯のJava上でも50msecを切る(RSAより速い)だそうで.
 [101]Re:ペアリング高速化
dsk . 2007 12/14(Fri) 10:39
etaT pairing とは "Tate" pairingの「逆」なんでしょうか?
supersingularを使うのは変わらないのでしょうか?

# google scholarでは見つかりませんでした。
# citeseerだとフランス語の "etat" にばっかりひっかかって駄目。
 [102]Re:ペアリング高速化
へるみ . 2007 12/14(Fri) 13:54
>pairingの「逆」なんでしょうか?
yes.詳細は未調査.

>supersingularを使うのは変わらないのでしょうか?
yes

log_2(3^97)〜153bit程度→RSA1000bit程度.でもF_3の拡大体には特殊な攻撃があって,RSA500〜700bitぐらいの強さでは?という悲観的な人もいて,bitをもうちょっととらないといかんかもらしい.
 [103]Re:ペアリング高速化
dsk . 2007 12/18(Tue) 18:48
> >pairingの「逆」なんでしょうか?
> yes.詳細は未調査.
日本人だったら、 Yoko Pairingになってたかも。

> bitをもうちょっととらないと
ならば、F_3をやめた方が速いかも、ですね。
 [104]Re:ペアリング高速化
へるみ . 2007 12/18(Tue) 21:37
>F_3をやめた方が速いかも、ですね。
それでも速いみたいですよ.

96_ .misc.
dsk . 2007 11/30(Fri) 20:48
Oblivious Transfer

OPEって3-party protocolじゃなかったっけ?昔一緒に勉強した内容だと、2-party(peer-to-peer)でやろうとすると、polynomialは使えなくて、1ビットの情報を交換するのに二回分のDHが必要だったと思います。DHを1024ビットなら効1/2048、2048ビットなら1/4096。

3-partyならpolynomialが使えるので効率は1/2とか1/3とかで出来る。こちらはあまり不思議な感じのしないプロトコルだったと思います。


連想配列とminimal perfect hash(MPH)

連想配列にMPHを使えるのはhyper graphのacyclicを見付けるやり方が普通のhashに近い性質をもっているからですよね。すなわち、高速にMPHが生成できるけど一回一回のMPHの計算量はそんなに小さくないですよね。
ただ、あれって必ずacyclicが見付かるとは限らんですよね。(証明が出きてないだけで実は反例もないとか?)そのあたりどうしてるんでしょう?

hotaruのときはMPH生成の時間は無視できたのでBob's MPHが圧倒的に速いという結論になりましたね。私はインタープリタの予約語検索にBob's MPHを使いました。こちらは百数十のエントリでもMPHの生成に分単位の時間がかかるので動的に使うのは無理ですね。
 [97]Re:misc.
dsk . 2007 12/3(Mon) 12:59
自己レス。論文読みました。昔勉強した論文とは違いますね。polynomialを使った2-partyで、
・体のサイズと多項式の次数によらないオーバヘッド
と言っていますが、仮定1を満すようなm(1/mがSenderにとってのS/N比となる)は少なくとも多項式の次数に比例して大きくないとNGだし、体の大きさのlogにも比例して大きくとらないと駄目だと思うので、3-partyのpolynomialのようにはいかずにやっぱり効率は悪そう(1ビットずつ送るOblivious Transferと違わなそう)です。
 [98]Re:misc.
へるみ . 2007 12/3(Mon) 22:35
>あれって必ずacyclicが見付かるとは限らんですよね。(証明が出きてないだけで実は反例もないとか?)そのあたりどうしてるんでしょう?

現実装では適当にループ回してトライしてます.それからMPHに近いものを作ってから,MPHにするところは力業つかってます.

>やっぱり効率は悪そう
論文の時期を見ると比較的古いのでそうなんでしょうね.それから進展があったのかはちょっと分かりません.

87_ .getchar()
dsk . 2007 11/2(Fri) 13:08
getchar()マクロってライブラリ側でbufferしてくれてるんじゃなかったの?というかライブラリのバッファが小さい?
 [88]Re:getchar()
へるみ . 2007 11/3(Sat) 1:37
されると思います.ただ今回のものはループ内の処理が少ないのでgetchar()の関数呼び出しが目立ってしまったという気がします.今どきはマルチスレッドからの呼び出しも考慮してるのかな.
 [89]Re:getchar()
dsk . 2007 11/6(Tue) 16:12
getchar()は今は関数なんですね!!昔はマクロじゃなかったっけ?stdinも__stdinpとかになってますね。昔はもっとややこしいマクロだったような...。あとisspace()についてですが、
Cのプログラム
#include <stdio.h>
#include <ctype.h>

int
main() {
int c, n = 0;
while((c = getchar()) != EOF) {
if(isspace(c)) ++n;
}
printf("n = %d\n", n);
return 0;
}
とC++のプログラム
#include <cstdio>
#include <cctype>

int
main() {
int c, n = 0;
while((c = getchar()) != EOF) {
if(isspace(c)) ++n;
}
printf("n = %d\n", n);
return 0;
}
で2.4GBのファイルを食わせて有意な差がなかったのですが、関数呼出のせい?
前者 48.54s user 4.74s system 74% cpu 1:11.26 total
後者 48.55s user 4.71s system 76% cpu 1:09.20 total
 [90]Re:getchar()
へるみ . 2007 11/7(Wed) 9:47
>有意な差がなかったのですが
while()の中身を空ループにしたらどうなりますかね.
・速度が変わらない
→ディスクアクセスに律速されている.
・変わった
→getchar()が重い.
・日記のようにfread()でまとめよみに変更してみる.
 [91]Re:getchar()
dsk . 2007 11/7(Wed) 17:01
ぼけてました。 #include <iostream>をしていないからCと同じisspace()が使われているかも?というのはおいといて、

ループが空:32.20s user 5.17s system 56% cpu 1:05.79 total
バッファリング: 28.50s user 5.18s system 44% cpu 1:15.09 total

どちらもCです。こりゃDiskかな?

C++バッファリング: 29.57s user 8.23s system 42% cpu 1:29.91 total
28.65s user 5.24s system 47% cpu 1:11.91 total
C++バッファリング cctype→iostream:28.65s user 5.24s system 47% cpu 1:11.91 total

ということでこのプログラムではdiskがネックですね。

ということで、8Kだけ読んで10万回繰り返してみました。
C: 1.46s user 0.01s system 99% cpu 1.472 total
C++cctype: 1.46s user 0.01s system 99% cpu 1.469 total
C++iostream: 2.07s user 0.00s system 99% cpu 2.071 total

ということで、C++のときは#include <cctype> ならCと同じ、#include<iostream>なら遅くなります。両方インクルードすると順序にかかわらず#include<iostream>の場合と同じです。

#include <cstdio>
#include <cctype>
static inline int my_isspace(int c) { return isspace(c); }
#include <iostream>

int
main() {
int i, r, n = 0;
char buf[8192];
fread(buf, 1, sizeof buf, stdin);
for(r = 0; r < 100000; ++r) {
for(i = 0; i < sizeof buf; ++i) {
if(my_isspace(buf[i])) ++n;
}
}
printf("n = %d\n", n);
return 0;
}

とか
#include <cstdio>
extern int isspace(int);
#define isspace my_isspace
#include <cctype>
#include <iostream>

int
main() {
int i, r, n = 0;
char buf[8192];
fread(buf, 1, sizeof buf, stdin);
for(r = 0; r < 100000; ++r) {
for(i = 0; i < sizeof buf; ++i) {
if(my_isspace(buf[i])) ++n;
}
}
printf("n = %d\n", n);
return 0;
}

とか小賢しいことやってみても遅い方でした。何度か実験しても小数第2位くらいまで同じ値になります。ですのでC++でiostreamを利用する場合、isspace()呼出を含む処理速度がクリティカルになる関数は分離して#include<iostream>ではなく#include<cctype>すべきである、ということですね。
 [94]isspace
egtra . 2007 11/15(Thr) 21:56
はじめまして。

C++のisspaceが遅いのはやっぱりlocale処理が関係しているせいらしいです。
http://www.fides.dti.ne.jp/~oka-t/cpplab-ctype.html
 [95]Re:getchar()
へるみ . 2007 11/17(Sat) 10:31
情報ありがとうございます.古くから知られていることなのですね.私ももう一度調べてみます.

92_ .std::string
dsk . 2007 11/9(Fri) 21:00
仕様的には
・&str[0]だとNULLで終わってないかも。
・str.c_str()だと必ずNULLで終るけど場合によっちゃコピーされる。
くらいじゃないですか?g++附属のSTLのソースを読む限りだと str.c_str()でも&str[0]でも変らなそうですが。
 [93]Re:std::string
へるみ . 2007 11/9(Fri) 23:59
そうですね.STLportの場合だと,&str[0]がターミネートされてなくて,えらいことになったことが何度がありました.

82_ .xbyak
dsk . 2007 10/16(Tue) 15:09
MacOS 10.5 Leopard(開発用build 9a559)での動作を確認しました。

Makefile中 cp -a は cp -pR の方が良いと思います(-aはGNU拡張オプションのためLeopardのcpは対応していませんでした。POSIXオプションだけだと-pRが最も近いです。symbolic/hard linkのコピー関係のときに-aだとlinkを保持してくれますが...)。
 [83]Re:xbyak
へるみ . 2007 10/16(Tue) 22:09
>cp -pR の方が良いと思います
ありがとうございます.私がMacで試したときは気がつきませんでした.次版で直します.
 [85]Re:xbyak
へるみ . 2007 10/18(Thr) 21:17
そういや,私が試したMac(バージョン失念)では何もせずにデータをコードとして実行できたんですが,Leopardでもそうなのかしら.
 [86]Re:xbyak
dsk . 2007 10/23(Tue) 15:29
実行に成功したので、そうだと思います。10倍どころではなく速くなってますね。quantize 1000で5.3sec→0.3secでした。多項式やbfとかも動いています。evalを持つinterpreter言語のコンパイラが作れそうですね。

81_ .misc.
dsk . 2007 9/17(Mon) 13:50
> 天声人語の件
単に米国は空いているのでしょう。
ところで、新聞は読売が一番読み易くて良いと思います。この点はトラ吉の妻も同意見なので、ウチでは読売を取っています。

> 首相の件
「病気(= すなわち精神力が不足による胃腸の病気)が理由で辞める」とは言えなかったから無理矢理理由をつけたんでしょうね。ちなみに、「テロ(アメリカがテロと定義するもの)との戦い」)にこだわっているのはアメリカで、阿部さんは就任直後の訪中の件からしてもアメリカの言いなりになる人だったので(小泉がかなりアメリカに抵抗した(=中国と仲良くせよ、というのを無視してわざと靖国問題の再燃などをさせた)のに対し、彼は外交に関しては殆どアメリカの言うがままでした)、彼が辞めることで、後程のニュースに流れたようにアメリカの日本に対する不信感は増したんでしょうね。
 [84]Re:misc.
UNA . 2007 10/17(Wed) 23:50
トラ吉の妻て…誰のことかと思ったら!

79_ .C++のストリームライブラリ
dsk . 2007 9/4(Tue) 18:39
C++のストリームライブラリは好まないのでC++でも
#include <cstdio>
して、Cのライブラリを使ったりしますね...。オブジェクト自身にtoString()のようなメソッドを持たせればprintfとかで事が足りるように思います。
 [80]Re:C++のストリームライブラリ
へるみ . 2007 9/4(Tue) 21:01
>C++のストリームライブラリは好まないので

私もそうなのですが,snprintfが処理系依存だったり,バッファサイズを気にしないといけないとかで,最近はsstreamを使うことも増えました.
フォーマットとかどうしてもタイプ数増えるし,うっとうしんですけどね.
あと,
getValue(char *out, size_t maxOutSize)よりはstd::string getValue()が便利だし.

78_ .SetFilePointer
dsk . 2007 8/27(Mon) 14:40
無理拡張APIですね。まぁ、「2GB以上のファイルは扱えなくて良い」且つ「面倒は御免」な人がそれなりに多数居ると思うので、そういう人達はlpDistanceToMoveHighを0にしとけ、ってことなんでしょうね。「ダミーDWORD変数へのポインタを渡せ」という仕様でも良いような気はしますが。

さらにGetFileSize()だと閾値は約4GB (2^32 -1)になるみたいですね。いやはや。

75_ .Error
dsk . 2007 8/21(Tue) 12:13
Error()をauto変数領域(通常はスタック)に生成させて(それをthrowせずに)終りですね。関数オブジェクトを生成させて(最適化後には生成してないかも)一度きり利用する場合なんかに使う書法ですね。
Javaなら前にnewを書かないとエラーになるのでthrowを書き忘れにくい??(私はJavaで良くthrowとnewをセットで書き忘れて怒られます)
 [76]Re:Error
へるみ . 2007 8/21(Tue) 15:40
あ,いやエラーにならない理由は分かってますが,「書き忘れてもエラーにならない記法になっちゃうのか(詠嘆)」というの意味です.念のため.
defaultのスペルミスやif(定数)などは警告だしてくれますが,これはしてくれないのだなあと.
#cstrに副作用がないか調べないと分からないから面倒ですが.
 [77]Re:Error
dsk . 2007 8/22(Wed) 22:32
舌たらずですね。もちろん分かっていると思って書いてます。Javaの方が少しだけ「間違いに気付きやすい」かな?その原因がC++だと if(...) Error(); がなんとなくエラーを起す関数を呼んだ気になって満足するところにあるのかな?Javaだとif(...) Error();はcompile errorで、if(...) new Error();だと間違いに気づくのでは?でも関数オブジェクト便利だし、どうしたものかな?というようなことを纏め切れずに書いたのでした。

74_ .for each
dsk . 2007 8/9(Thr) 11:53
VC++.NET は C++に非ず、ということで。

71_ .開闢?
. 2007 8/7(Tue) 0:48
xbyak の名前の元が「開闢」ってことですか?
 [72]Re:開闢?
へるみ . 2007 8/7(Tue) 9:27
そうです.実行時にコード(世界)ができますよ,というニュアンスで.
 [73]Re:開闢?
dsk . 2007 8/7(Tue) 17:43
すなわち「X」をエックスではなくてカイと読ませてる訳ですね。
そう言えば昔「クスバイアクってなんや」とか聞いた覚えがあります。

68_ .switch jobs
ys . 2007 7/27(Fri) 0:55
転職、おめでとうございます。

実は僕も 10/1 から飯田橋の某社に行く (もちろん転職で) 予定で、
今は引越しの準備などでちょっとバタバタしているところです。

職場が比較的近いこともありますし、いつか呑みに行けたら良いですね。
 [69]Re:switch jobs
へるみ . 2007 7/27(Fri) 22:55
すいません,イニシャルだと候補がいくつかあってどなたかしぼれません(^^;
メールなどでコンタクトお願いします.m(__)m
 [70]Re:switch jobs
ys . 2007 7/27(Fri) 23:26
あらら。しぼれませんでしたか。すみません。
とりあえずメールを送らせていただきますね。

63_ .仕様変更
へるみ . 2007 7/20(Fri) 8:49
dskのアイデアの通り,漢数字にしてみました.
 [64]Re:仕様変更
へるみ . 2007 7/20(Fri) 9:14
なんでじゃ,いきなり書き込まれた.手動か?
 [66]Re:仕様変更
へるみ . 2007 7/21(Sat) 7:52
全然あかん.別の方法で対処してみた.
 [67]Re:仕様変更
dsk . 2007 7/21(Sat) 13:41
漢数字もだめですか?残念。
手動なら対策はIP以外ないですね。

60_ .Mac mini
dsk . 2007 7/15(Sun) 0:58
VGAのころだったら、たとえば4番ピンと10番ピンを直結すれば16’’モニタが接続されていると認識されると思うけど、流石にDVIだよね。DVI-VGA変換をつないでそのVGA側で4と10の直結じゃだめかな?
 [61]Re:Mac mini
へるみ . 2007 7/16(Mon) 0:24
webでそのあたりの情報を見つけました.ただそんなことしなきゃモニタレスにならんというのがなんだかなあ….
 [62]Re:Mac mini
dsk . 2007 7/18(Wed) 1:57
まぁ、そういう使い方を普通にしたければXserve買えってことじゃないかな。Appleのサポートに電話すると分かるけど、ものすごく丁寧に答えてくれる。あのクオリティで想定外の使い方までサポート出来ないと思う。普通に使っている人のサポートのために、どこがトラブルかを分ける助けになる機能は重要、ということでしょう。
その範囲外の使い方をしたければ英語のTechNoteを見るのが一番だと思います。

59_ .Javascript
dsk . 2007 7/10(Tue) 14:07
>FirefoxのJavaScriptの整数の実装は230を超えなければint, そうでなければdoubleを使う.
え?全部doubleだと思ってた。割り算したら急にdoubleになったりするのかな?

56_ .整列乗車
dsk . 2007 7/7(Sat) 0:47
こんなの?
http://pc.watch.impress.co.jp/docs/2003/1001/sony07.jpg
 [57]Re:整列乗車
へるみ . 2007 7/9(Mon) 22:38

ちょっと違いますね(笑).

------------
電車
-ドア-------
--------------
○○○.●●●
○○○.●●●
○○○.●●●
○○○



-ドア-------
○○○-------
.↑..●●●
....●●●
....●●●



-ドア-------
++++++------
●●●
●●● ←
●●●

こういうの
 [58]Re:整列乗車
dsk . 2007 7/10(Tue) 14:05
軍隊ですね。

47_ .SPAM
へるみ . 2007 7/4(Wed) 23:31
昨日からSPAM書き込みがうっとうしい.総当たりで来てるのかな.
 [50]Re:SPAM
dsk . 2007 7/6(Fri) 0:38
総当たりにしても、スクリプトで見ているにしても、掛け算では対処にならないような...。
数字のところ、a.gifなら0、s.gifなら1、d.gifなら2とかで画像表示してみるとか。
 [51]Re:SPAM
へるみ . 2007 7/6(Fri) 8:49
>総当たりにしても
とりあえず桁数増やしました.これで止まれば総当たりということで.
 [53]Re:SPAM
へるみ . 2007 7/6(Fri) 9:43
止まりませんでした(^^;
画像は面倒なのでどうしようかな.
 [54]Re:SPAM
dsk . 2007 7/6(Fri) 20:53
> 画像は面倒なのでどうしようかな.
全角表示。どう?
 [55]Re:SPAM
へるみ . 2007 7/6(Fri) 22:52
とりあえずipではじくことにしました.

45_ .リンクミス
dsk . 2007 6/4(Mon) 13:22
latestの昔が5月のはずが、4月になってます。
 [46]Re:リンクミス
へるみ . 2007 6/5(Tue) 17:48
thanks

article number: delete key:

Response BBS by The Room