ruby-trunk-changes r52068 - r52076

今日は String#* や String#dup の最適化や、オブジェクト確保の最適化などがありました。

nobu: r52068 2015-10-07 11:19:59 +0900

r51952 で test/lib/test/unit に追加した all_assertions でエラー時のメッセージをテストケースごとに整形して出力するようにしています。

nobu: r52069 2015-10-07 17:26:56 +0900

re.c のインデントの修正のみ。

nobu: r52070 2015-10-07 17:30:20 +0900

str_new_frozen() でオブジェクトが String だとわかっているので FL_TEST() のかわりに即値チェックのない FL_TEST_RAW() を使うように最適化しています。

nobu: r52071 2015-10-07 17:31:22 +0900

String#* で右辺が 1 と 0 の時の最適化を行なっています。これ frozen string literal の話の流れで "str".dup のかわりに "str"*1 とした時に高速化しようという副産物というかなんというかそういうものみたいですね。

ko1: r52072 2015-10-07 20:18:17 +0900

オブジェクトをわりあてる newobj_of() で空きがなくて GC を走らせるケース(slow path)とそうではない時(fast path)の処理を関数で newobj_of_init() と newobj_of_slowpass() に分けています。 newobj_of_init() は inline 化して、これにより register 退避のコストを抑えるという最適化だそうです。

nobu: r52073 2015-10-07 20:43:17 +0900

文字列リテラルの評価についてのベンチマークスクリプト benchmark/bm_vm2_string_literal.rb を追加しています。また embed できる小さな文字列の時の対応を追加しています。

nobu: r52074 2015-10-07 21:32:54 +0900

rb_str_resurrect() の内容を str_duplicate() に展開して rb_str_dup() でも rb_str_resurrect() の処理を使いまわようにしています。 String#dup も高速化しているんでしょうか。

nobu: r52075 2015-10-07 21:40:34 +0900

オブジェクトが freeze されているかのチェックを行なう RB_OBJ_FROZEN() から即値チェックを省いた RB_OBJ_FROZEN_RAW() というマクロを追加しています。

nobu: r52076 2015-10-07 22:55:07 +0900

test/minitest の MetaMetaMetaTestCase#with_output というメソッドで出力をすげかえて実行するときに、ensure での復旧が常に STDOUT へ戻していたので、あらかじめ退避しておいたものを戻すようにしています。