diff options
author | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-05-30 00:20:15 +0000 |
---|---|---|
committer | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-05-30 00:20:15 +0000 |
commit | e95cbfebacf9ae97a752719e346cf6b264243935 (patch) | |
tree | f4d574df20393cb170fa9cd37c0b4160d3246f73 /time.c | |
parent | bfb66a15e94963fdb86301fa3d438ea711855fc4 (diff) | |
download | ruby-e95cbfebacf9ae97a752719e346cf6b264243935.tar.gz |
variable.c: avoid compatibility table with generic ivars
This recovers and improves performance of Marshal.dump/load on
Time objects compared to when we implemented generic ivars
entirely using st_table.
This also recovers some performance on other generic ivar objects,
but does not bring bring Marshal.dump/load performance up to
previous speeds.
benchmark results:
minimum results in each 10 measurements.
Execution time (sec)
name trunk geniv after
marshal_dump_flo 0.343 0.334 0.335
marshal_dump_load_geniv 0.487 0.527 0.495
marshal_dump_load_time 1.262 1.401 1.257
Speedup ratio: compare with the result of `trunk' (greater is better)
name geniv after
marshal_dump_flo 1.026 1.023
marshal_dump_load_geniv 0.925 0.985
marshal_dump_load_time 0.901 1.004
* include/ruby/intern.h (rb_generic_ivar_table): deprecate
* internal.h (rb_attr_delete): declare
* marshal.c (has_ivars): use rb_ivar_foreach
(w_ivar): ditto
(w_object): update for new interface
* time.c (time_mload): use rb_attr_delete
* variable.c (generic_ivar_delete): implement
(rb_ivar_delete): ditto
(rb_attr_delete): ditto
[ruby-core:69323] [Feature #11170]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50680 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'time.c')
-rw-r--r-- | time.c | 5 |
1 files changed, 1 insertions, 4 deletions
@@ -4735,16 +4735,13 @@ time_mload(VALUE time, VALUE str) long nsec; VALUE submicro, nano_num, nano_den, offset, zone; wideval_t timew; - st_data_t data; time_modify(time); #define get_attr(attr, iffound) \ - attr = rb_attr_get(str, id_##attr); \ + attr = rb_attr_delete(str, id_##attr); \ if (!NIL_P(attr)) { \ - data = id_##attr; \ iffound; \ - st_delete(rb_generic_ivar_table(str), &data, 0); \ } get_attr(nano_num, {}); |