1.9.2では結局どうしてたんだまず原因追及かなあ。-vが無いとvalidationで怒られてた関数名が変わっていて比較が困難ああ、わかった。タイマ割り込みごとにgvl_yield()してたと思ってほぼ間違いないな。タイマ割り込みが10msごとだった、ので結論としては10msごとに処理してるだけのはずなんだけどなあ。unakパッチと僕がさっき貼ったパッチ両方あてたら1.9.2と同じになります?ちょーっと重い気がするけど、許せる範囲1.9.2と差分あります?動きに?うん両方知ってたら明らかに差があるとわかるね。...じゃあ、なにか僕の知らない変更があるなあちゃんと調べた方がいいフラグが立っているのは分かるんだがWindows環境構築ってすんげえめんどくさいうまく説明できないのだが、1.9.2はぬるぬる完璧1.9.3はぬるぬるしないがストレスを感じるほどではないちがった。trunk改といっていたのか1.9.2>(ぬるぬるの壁)>unakパッチ+小崎パッチなtrunkまたは1.9.3>>>>(ストレスの壁)>>>>unakパッチなtrunkまたは1.9.3>>>>>>(操作不能の壁)>>>>>>素のtrunkまたは1.9.3こんな感じ。sectionでロックしてたのが、1.9.3以降はmutexになってる。重いああ、そういえばささださんが変えてましたねこれはしゃーないのかなー。sectionにしてpthreadと同じく、数百ミリに一回強制スイッチさせるのがいいんじゃないかと動作が同じになって考えることが減るという意味でただ250msは100msまで下げないとだめだな100msじゃだめなんじゃね、というのが俺の結論なんですけどね。sectionにもどしてビルドしてみてもらえません。日本にはYBBとNTTがいたのでよかったgitさんは使わないので、えーとというか、そういう感じの違いじゃないよなこれ。section化でぬる、くらいにはなった。1.9.2ほどぬるぬるしてないうがあまず100msへの変更はベンチはかり直して、もんだいなさそうなら入れてしまおう。これだけでMacは解決するあと何が違うんだろうなあ。おもいつかないですじつはtkが違うってオチはないですよね?はははtkはともかくtcltklib.soは違うかもなあしかし同じのを試すのは(バイナリ互換性がないので)難しい。誰だよ2.0.0に上げたやつは下げればいいじゃないどんだけ俺を苦しめる気だ差分を見る限り、そんな大きな差がある感じではないな。WindowsはWindowsに興味ある人が直してくれそうな気がするからほっとくかな興味ある俺が一括revertWindows以外に影響ないならそれでもいいですよあると思うけどWindows以外に興味がある人が直してくれそうな気がするからほっとく。いやいやいや違うこと言ってないのにぃところで、真面目に聞くのですが、今はタイマ割り込みが100msで、タスクスイッチ(という言い方でいい?)が250msじゃないすか。あれ、へんだよねこのそれぞれの数字ってなんか根拠あるのん?100はささださんの実測値、250は僕の実測値で、こさきさんは後者を100にしようとしてるんだよね?そうですこれさあ、後者をもっと小さい値にするのはどうなん?前者より小さい場合の意味があんまりないんじゃないかなあRubyでスレッドの優先度使ってる人ってほぼいないと思うしWindowsで前者を小さい値にしようとしてるのだ。Windowsだけ前者を10msに戻すというのはありかもしれないですね。いえばpriorityでビットシフトするので、前者100の半分の50くらいまでなら小さくしてもいいんじゃないか。単純にデフォルト値はTIME_QUANTUM_USECでいいのかもしれない。うん、それかなとりあえずそうしてみましょっか。シグナルとかで割り込んだときはスイッチする義務はない。いう分かりやすい意図になる気がしますとりあえず、今回はそこで妥協しよう。意図的に放置してたるいさんを釣るつもりだったのにusaさんに本気だされてしまって崩壊したtalさん昨夜ちょっと見てたけどね。loop+Thread.passは手元の環境では50msくらいになるので1.9.2と同じ。いうか1.9.2だと安定しないな。10msくらいのこともあれば130msくらいのこともあるな。:)たぶんWindowsスケジューラには僕のしらない謎があるそれは不思議でもなんでもなくて、pthread版でも1.9.2はそうですへーまあ、50msで安定するならそれはそれでよいや。cmpxchg一発でロック取る最速ロックだと2つのスレッドのどっちが勝つかは運次第だからこれが20msくらいだとぬるぬるになるってことなのかにゃあ。ワーストケースはすごく悪くなる20msは要求されてないと思うけどなあ俺もそう思うんだけどねえ。CriticalSectionとはそういうAPIだとおもってた個人的にはmutexが揃いすぎていて気持ち悪かった。CriticalSectionにするとそういう意味では1.9.2と同じ感じ。しないので、んーこれでスイッチの頻度は同じくらいになってるってことなんだけどなあ。明らかに$50で割に合わないうわ意味ないはずと思いながら1msにしたらぬるぬるすぎワラタWindowsってWindow処理おそいの?と疑問におもったそういうことじゃないと思うが。なんでこんなにリニアに動作に影響するんだ?むしろそれがキモイまじで1msにしとくか。どれくらい悪影響があるんだろうか。benchで実際にはかったらいいと思うのwindowsのスケジューラがまだラウンドロビンベースなら実はそんなに悪くないアイデアかも知れないべんちまーくちうああ、いや、やっぱり1msに一回コンテキストスイッチはやり過ぎな予感まあ、ベンチの結果を待ちましょう。つかむっちゃ時間かかるんだよなあ。経過を眺めている感じだと、誤差程度しか違いがないものばかり。影響がありそうなのは後ろのほうかな。有意な差があるのはio_file_createとvm_thread_mutex3の2個だけ。前者はなんでじゃろ?後者は2.3秒→30.9秒なのでさすがにまずい気がする。本当はtcltklibのeventloopはGVLを解放した状態で回って、なんかイベントがあってrubyコードを実行しないといけなくなった時だけ改めてGVLを確保しないといけないのではないか。いう結論に達したけどまあいいや。ruby-jaで名前を呼ばれてたがログが長いのでとりあえず放置していいという事だけ認識して満足した要約すると、$50問題特命担当に就任です。まで読んだ要約するとtalさんまかせたunakさんはWindowsのダークサイドに落ちていってそれっきりです。なんという押し付けあい。TIME_QUANTUM_USEC;後のダチョウ倶楽部である。小崎さんが入れてくれるってことでOK?りょうかいしましたRuby2.0ではThread毎にrenice(limitを短縮)できるように提案してみようWindowsで何にするか(1msはさすがに酷いよな)は適当に考えて私が入れておきますです。0でいいんだったりして。write(2)をブロックさせる手っ取り早い方法は何か。いうのができる気がするのである。さっきruby-devに投げたreadの逆だけど、readだと[BUG]だがwriteならきっとSEGVにできる。これなにがおきてるんだろうtcltklib見てる?いちおうlib_eventloop_coreの中でぐるぐる回っている。priorityスレッドとして扱う必然も無い気がしているなんかイベントがあったら拾って処理。あと、tcltklib.cで1.9系だとタイマーが5msで貼ってるのだけど意味が分からん。どのバージョンでもそれは反応できなくないかなあ確か800回転に1度くらいrb_thread_schedule()とかいう感じだったと思った。TkRoot.new.mainloop()が絶賛競合中。mainloop()のなかでsleep_foreverしてない?しないlib_eventloop_core()みてたんだけどでは、どうやって寝てるんですか寝てないよ。先ほどから見ていたタイミングでしかGVL離さないので普段はそっちが元気に空回り。300msごとにしかイベントを拾えない。ゆえにかくかくしちゃうというのが現象の全体です。いうビジーループ的な流れをするのが仕様なんですかテキトーなタイミングでrb_thread_schedule()呼んでるのでそこまで悪質ではない。{のパスでしか使っていないはず。使わないと思っていいです。実行してみることをお勧めする。可)DUMP*ってのがだらだらとstderrに表示されるのでどこ通ってるかはわかる。なんだっけ--debugああ、嘘ついた。800.timesじゃなくて(800/10).times相当だMacだとresizeはtkにcallbackされてないという知見が得られた。ほんとうだろうかmjskであればそりゃWindowsみたいにひっかからないよね。windowだけということはありえないので、resizeするときに子windowの調整のために通知は飛ぶはずだと思うけど(ぜんぶ推測です)まあスケジューラ的にはビジーループしてるやつと、ビジーループしつつThread.passしてるやつらはどれだけぞんざい扱ってもいいやつらなので急速に興味がうせつつあるあきらかにスレッドスケジューラでやるのは筋が違うだろう的なでも、ぼくちんもっともっと頻繁にタスクスイッチされたい!その辺、GCのパラメータが調整できるようなったように調整できるといいかもしれないですね。僕に聞いてます?真面目にGVL解放してイベント待ちしたとしても、イベントが起きてrubyコードで書かれたハンドラに突入するためにGVL取りに行ったらやっぱり最悪300ms待たされるよね。さっき考えてたのはUIスレッドが奪いに来たら優先的にGVLわたしてあげる仕組み作った方がいいんかなーというネタだった難しいことが起きてない限りGVL分捕るAPIは確かにあるといかもしれんすね。(そして悪用される)スレッド間の優先度だと悪用されてもたかがしれてないですかねあほなライブラリ書かれたらだめだからやっぱりだめなのかなあまあ、APIなら拡張ライブラリなので、カジュアルユーザーがrubyでビジーループ書くよりはアホなことされる可能性は低いでしょう。ところで知ってたら教えてほしいのですが、1.8のスレッド切り替えのタイミングっていつでしょ?何msだったかな。なんであんなにビジーループ耐性高いんですかタイマーなんだ。意外っタイマーというかまあ時々時計見て「あ、そろそろ時間だからスイッチしなくちゃ」みたいなうーむ総合すると、やっぱりtkが特殊すぎるのでworkaroundとしてはタイマースレッドの感覚を切り替えるAPI用意してtk使われたら頻繁に起こすのかなあ。消費電力無視してとても気に入らない0.06秒ですた。<1.8合ってるかな。1.9.2よりも長いのかそうはみえんが気が向いたらもっと早く切り替えるかもしれない。見ても1ms以内に切り替えてるような。0.06msなのかまさか。