Для обработки того же XML-я требуется многократная работа с подстроками в режиме read-only.
При выделении подстроки происходит копирование памяти. Если убрать это копирование, то можно ускорить в 3-4 раза.
Macintosh:fast_slice family$ ./test.rb user rb_substr: 11.200000 fast_slice: 2.540000Как же в руби добиться такого? Немного черной магии и “нечестной” работы со строками.
include “ruby.h” static int params_invalid(VALUE beg, VALUE len, int limit) { return (NUM2INT < 0 || NUM2INT < 0 || FIX2INT+FIX2INT(len) > limit); } VALUE fast_slice(VALUE self, VALUE beg, VALUE len) { VALUE result = Qnil; if(params_invalid(beg, len, RSTRING→len)) { return Qnil; } result = rb_str_new3(self); rb_obj_freeze(self); RSTRING- >ptr = RSTRING→ptr + FIX2INT; RSTRING→len = FIX2INT; rb_obj_freeze(result); return result; } void Init_fast_slice() { rb_define_method(rb_cString, “fast_slice”, fast_slice, 2); }Такое короткое расширение позволяет создавать подстроки от строки, обходясь без копирования памяти.