From: "kosaki (Motohiro KOSAKI)" Date: 2012-03-30T04:20:58+09:00 Subject: [ruby-dev:45462] [ruby-trunk - Feature #6082] io_binwrite()内でwritev()を使う Issue #6082 has been updated by kosaki (Motohiro KOSAKI). > なんとなく kosaki さんあたり、もしコメントあったらどうぞ。 関数のなかにでっかく#ifdefいれんな。というのが1つ。writevがない環境を考えると既存のコードを消せないので有為に速度向上することが提示されないと入れる意味が無いというのが1つ。そんぐらいかなあ ---------------------------------------- Feature #6082: io_binwrite()内でwritev()を使う https://bugs.ruby-lang.org/issues/6082#change-25411 Author: Glass_saga (Masaki Matsushita) Status: Assigned Priority: Normal Assignee: nobu (Nobuyoshi Nakada) Category: core Target version: io.cのio_binwrite()内で、writev()を用いる事を提案します。 現在のio_binwrite()は、実際にシステムコールを呼ぶ時には渡された文字列がwbufに収まるならばMEMMOVE()で収めてしまってio_fflush()し、 収まらなければfflushした後に再度rb_write_internal()を呼んでいますが、writev()を用いる事でMEMMOVE()の必要がなくなり、 wbufと渡された文字列を結合する事なく一度のシステムコールで書き出す事ができます。 また、wbufと渡された文字列を1度に書き出す事に成功すれば、他のスレッドからのwriteが間に入らないというメリットもあります。 patchを添付します。 test-allを実行したところ、test_keep_alive_EOF(TestNetHTTPKeepAlive)でfailure、test_inspect_nonascii(TestDir_M17N)でerrorとなりますが、 これはtrunkのr34799でも同様なので、このpatchによる問題ではないものと思われます。 -- http://bugs.ruby-lang.org/