[#37875] ERB の仕様 — URABE Shyouhei <s-urabe@...>

みなさまはじめまして。

44 messages 2003/07/15
[#37876] Re: ERB の仕様 — Masatoshi SEKI <m_seki@...> 2003/07/15

咳といいます。

[#37877] Re: ERB の仕様 — URABE Shyouhei <s-urabe@...> 2003/07/15

mput です。

[#37879] Re: ERB の仕様 — m_seki@... 2003/07/15

[#37883] Re: ERB の仕様 — URABE Shyouhei <s-urabe@...> 2003/07/16

mput です。

[#37884] Re: ERB の仕様 — m_seki@... 2003/07/16

[#37888] Re: ERB の仕様 — URABE Shyouhei <s-urabe@...> 2003/07/16

mput です。

[#37889] Re: ERB の仕様 — m_seki@... 2003/07/16

[#37890] Re: ERB の仕様 — URABE Shyouhei <s-urabe@...> 2003/07/17

mput です。

[#37891] Re: ERB の仕様 — MoonWolf <moonwolf@...> 2003/07/19

MoonWolfです。

[#37896] Re: ERB の仕様 — MoonWolf <moonwolf@...> 2003/07/20

MoonWolfです。

[#37898] Re: ERB の仕様 — Masatoshi SEKI <m_seki@...> 2003/07/20

咳といいます。

[#37900] Re: ERB の仕様 — MoonWolf <moonwolf@...> 2003/07/20

MoonWolfです。

[#37901] Re: ERB の仕様 — Masatoshi SEKI <m_seki@...> 2003/07/20

咳といいます。

[#37906] control user ID / group ID — Hidetoshi NAGAI <nagai@...>

永井@知能.九工大です.

20 messages 2003/07/20
[#37912] Re: control user ID / group ID — YOKOYAMA Takehiro <tac@...> 2003/07/21

[#37913] Re: control user ID / group ID — Hidetoshi NAGAI <nagai@...> 2003/07/21

永井@知能.九工大です.

[#37916] Re: control user ID / group ID — YOKOYAMA Takehiro <tac@...> 2003/07/21

[#37941] multipart/form-dataのためのcgi.rbの修正 — 堀川 久 <vzw00011@...>

こんにちは。

18 messages 2003/07/22
[#37944] Re: multipart/form-dataのためのcgi.rbの修正 — matz@... (Yukihiro Matsumoto) 2003/07/23

まつもと ゆきひろです

[#37945] Re: multipart/form-dataのためのcgi.rbの修正 — nobu.nakada@... 2003/07/23

なかだです。

[#37948] Re: multipart/form-dataのためのcgi.rbの修正 — matz@... (Yukihiro Matsumoto) 2003/07/23

まつもと ゆきひろです

[#37951] Re: multipart/form-dataのためのcgi.rbの修正 — nobu.nakada@... 2003/07/23

なかだです。

[#37953] Re: multipart/form-dataのためのcgi.rbの修正 — matz@... (Yukihiro Matsumoto) 2003/07/23

まつもと ゆきひろです

[#37954] Re: multipart/form-dataのためのcgi.rbの修正 — nobu.nakada@... 2003/07/23

なかだです。

[ruby-list:37882] Re: ERB の仕様

From: UENO Katsuhiro <unnie@...>
Date: 2003-07-16 03:25:06 UTC
List: ruby-list #37882
うえのです。

On Wed, 16 Jul 2003 10:52:00 +0900
Shinya Kawaji <kawaji@hoppeta.com> wrote:

> > 1.2MBくらいの素朴なeRubyスクリプトを準備して試したのですが、
> > ruby1.6.8とruby1.8.0だと全く結果が違くて驚きました。
> 
> 私も高速化に興味があるのですが(興味があるだけで自分で何が出来るのかは
> まだ解らないのですが)、もし上記の「1.2MBくらいの素朴なeRubyスクリプト」

以前 eRuby-1.0.3 + Ruby-1.6.8 で Web アプリケーションを書いたとき
あまりにも eRuby が遅かったので (かといって 1.8 に上げることは
できなかったので)、場当たり的にこんな修正をして凌いだことがあります。


--- eruby_main.c.orig	Mon Oct 15 13:55:40 2001
+++ eruby_main.c	Sat Mar  1 22:36:51 2003
@@ -376,21 +376,47 @@
     }
 }
 
+
+static struct {
+    char *buf;
+    int len;
+    int max;
+} eruby_defout;
+
 static VALUE defout_write(VALUE self, VALUE str)
 {
     str = rb_obj_as_string(str);
-    rb_str_cat(self, RSTRING(str)->ptr, RSTRING(str)->len);
+    if (eruby_defout.len + RSTRING(str)->len > eruby_defout.max) {
+        while (eruby_defout.len + RSTRING(str)->len > eruby_defout.max)
+            eruby_defout.max *= 2;
+        REALLOC_N(eruby_defout.buf, char, eruby_defout.max);
+    }
+    memcpy(eruby_defout.buf + eruby_defout.len,
+           RSTRING(str)->ptr, RSTRING(str)->len);
+    eruby_defout.len += RSTRING(str)->len;
     return Qnil;
 }
 
 static VALUE defout_cancel(VALUE self)
 {
-    if (RSTRING(self)->len == 0) return Qnil;
-    RSTRING(self)->len = 0;
-    RSTRING(self)->ptr[0] = '\0';
+    eruby_defout.len = 0;
     return Qnil;
 }
 
+static VALUE defout_new()
+{
+    eruby_defout.max = 102400;
+    eruby_defout.len = 0;
+    eruby_defout.buf = ALLOC_N(char, eruby_defout.max);
+    return Data_Wrap_Struct(rb_cObject, NULL, NULL, &eruby_defout);
+}
+
+static void defout_free()
+{
+    free(eruby_defout.buf);
+}
+
+
 static int guess_mode()
 {
     if (getenv("GATEWAY_INTERFACE") == NULL) {
@@ -438,7 +464,7 @@
     if (eruby_mode == MODE_CGI || eruby_mode == MODE_NPHCGI)
 	rb_set_safe_level(1);
 
-    rb_defout = rb_str_new("", 0);
+    rb_defout = defout_new();
     rb_io_binmode(rb_stdout);	/* for mswin32 */
     rb_define_singleton_method(rb_defout, "write", defout_write, 1);
     rb_define_singleton_method(rb_defout, "cancel", defout_cancel, 0);
@@ -545,8 +571,8 @@
     if (eruby_mode == MODE_FILTER && (RTEST(ruby_debug) || RTEST(ruby_verbose))) {
 	print_generated_code(stderr, code, 0);
     }
-    out = RSTRING(rb_defout)->ptr;
-    nout = RSTRING(rb_defout)->len;
+    out = eruby_defout.buf;
+    nout = eruby_defout.len;
     if (!eruby_noheader &&
 	(eruby_mode == MODE_CGI || eruby_mode == MODE_NPHCGI)) {
 	if (eruby_mode == MODE_NPHCGI)
@@ -558,6 +584,7 @@
     }
     fwrite(out, nout, 1, stdout);
     fflush(stdout);
+    defout_free();
 }
 
 int main(int argc, char **argv)



 --  ----  -     - - -- -
うえの かつひろ <unnie@blue.sky.or.jp>

In This Thread