हां, यह वही सिद्धांत है। मुझे एक प्रोजेक्टउलर पहेली याद है जहां मैंने इसे दोनों तरीकों से आजमाया, कॉलिंग को कॉल करना बहुत तेज़ है।
आप रूबी स्रोत की जाँच करते हैं, तो शामिल होने के सी में सभी कार्यान्वित किया जाता है, यह तार (कोई मध्यवर्ती वस्तु निर्माण, कोई कचरा संग्रहण) श्रृंखलाबद्ध की तुलना में बहुत तेजी से हो रहा है:
/*
* call-seq:
* array.join(sep=$,) -> str
*
* Returns a string created by converting each element of the array to
* a string, separated by <i>sep</i>.
*
* [ "a", "b", "c" ].join #=> "abc"
* [ "a", "b", "c" ].join("-") #=> "a-b-c"
*/
static VALUE
rb_ary_join_m(argc, argv, ary)
int argc;
VALUE *argv;
VALUE ary;
{
VALUE sep;
rb_scan_args(argc, argv, "01", &sep);
if (NIL_P(sep)) sep = rb_output_fs;
return rb_ary_join(ary, sep);
}
जहां rb_ary_join है :
VALUE rb_ary_join(ary, sep)
VALUE ary, sep;
{
long len = 1, i;
int taint = Qfalse;
VALUE result, tmp;
if (RARRAY(ary)->len == 0) return rb_str_new(0, 0);
if (OBJ_TAINTED(ary) || OBJ_TAINTED(sep)) taint = Qtrue;
for (i=0; i<RARRAY(ary)->len; i++) {
tmp = rb_check_string_type(RARRAY(ary)->ptr[i]);
len += NIL_P(tmp) ? 10 : RSTRING(tmp)->len;
}
if (!NIL_P(sep)) {
StringValue(sep);
len += RSTRING(sep)->len * (RARRAY(ary)->len - 1);
}
result = rb_str_buf_new(len);
for (i=0; i<RARRAY(ary)->len; i++) {
tmp = RARRAY(ary)->ptr[i];
switch (TYPE(tmp)) {
case T_STRING:
break;
case T_ARRAY:
if (tmp == ary || rb_inspecting_p(tmp)) {
tmp = rb_str_new2("[...]");
}
else {
VALUE args[2];
args[0] = tmp;
args[1] = sep;
tmp = rb_protect_inspect(inspect_join, ary, (VALUE)args);
}
break;
default:
tmp = rb_obj_as_string(tmp);
}
if (i > 0 && !NIL_P(sep))
rb_str_buf_append(result, sep);
rb_str_buf_append(result, tmp);
if (OBJ_TAINTED(tmp)) taint = Qtrue;
}
if (taint) OBJ_TAINT(result);
return result;
}
स्रोत
2010-12-09 19:43:42
+1 बेंचमार्क! बेंचमार्क! बेंचमार्क! बेंचमार्क हमारा दोस्त है! :-) –
यह बहुत आश्चर्यजनक है - पिकैक्स में, वे सूचियों का उपयोग तेजी से करने का वर्णन करते हैं। स्मृति सीमित होने पर शायद परिणाम अलग होंगे। –
यह विभिन्न वातावरण, और विभिन्न डेटा आकारों और रूबी के विभिन्न संस्करणों के लिए भिन्न हो सकता है। बेंचमार्किंग और ऑप्टिमाइज़ेशन कभी-कभी काला जादू हो सकता है। – jergason