avoid some unnecessary work in string port creation

These changes speed up string-port creation by 10% or so in my
tests --- nearly all of that by avoiding the repeated interning
of the symbol 'string.
This commit is contained in:
Matthew Flatt 2012-01-11 07:39:49 -07:00
parent 8c092f093b
commit 8976a4c99a

View File

@ -144,6 +144,7 @@ ROSYM static Scheme_Object *cr_symbol;
ROSYM static Scheme_Object *lf_symbol; ROSYM static Scheme_Object *lf_symbol;
ROSYM static Scheme_Object *crlf_symbol; ROSYM static Scheme_Object *crlf_symbol;
ROSYM static Scheme_Object *module_symbol; ROSYM static Scheme_Object *module_symbol;
ROSYM static Scheme_Object *string_symbol;
READ_ONLY static Scheme_Object *default_read_handler; READ_ONLY static Scheme_Object *default_read_handler;
READ_ONLY static Scheme_Object *default_display_handler; READ_ONLY static Scheme_Object *default_display_handler;
@ -191,6 +192,7 @@ scheme_init_port_fun(Scheme_Env *env)
REGISTER_SO(lf_symbol); REGISTER_SO(lf_symbol);
REGISTER_SO(crlf_symbol); REGISTER_SO(crlf_symbol);
REGISTER_SO(module_symbol); REGISTER_SO(module_symbol);
REGISTER_SO(string_symbol);
any_symbol = scheme_intern_symbol("any"); any_symbol = scheme_intern_symbol("any");
any_one_symbol = scheme_intern_symbol("any-one"); any_one_symbol = scheme_intern_symbol("any-one");
@ -198,6 +200,7 @@ scheme_init_port_fun(Scheme_Env *env)
lf_symbol = scheme_intern_symbol("linefeed"); lf_symbol = scheme_intern_symbol("linefeed");
crlf_symbol = scheme_intern_symbol("return-linefeed"); crlf_symbol = scheme_intern_symbol("return-linefeed");
module_symbol = scheme_intern_symbol("module"); module_symbol = scheme_intern_symbol("module");
string_symbol = scheme_intern_symbol("string");
scheme_write_proc = scheme_make_noncm_prim(sch_write, "write", 1, 2); scheme_write_proc = scheme_make_noncm_prim(sch_write, "write", 1, 2);
scheme_display_proc = scheme_make_noncm_prim(display, "display", 1, 2); scheme_display_proc = scheme_make_noncm_prim(display, "display", 1, 2);
@ -582,7 +585,7 @@ scheme_make_sized_byte_string_input_port(const char *str, intptr_t len)
ip = scheme_make_input_port(scheme_string_input_port_type, ip = scheme_make_input_port(scheme_string_input_port_type,
make_indexed_string(str, len), make_indexed_string(str, len),
scheme_intern_symbol("string"), string_symbol,
string_get_bytes, string_get_bytes,
string_peek_bytes, string_peek_bytes,
scheme_progress_evt_via_get, scheme_progress_evt_via_get,
@ -2438,12 +2441,17 @@ static Scheme_Object *
open_input_byte_string (int argc, Scheme_Object *argv[]) open_input_byte_string (int argc, Scheme_Object *argv[])
{ {
Scheme_Object *o; Scheme_Object *o;
intptr_t len;
if (!SCHEME_BYTE_STRINGP(argv[0])) if (!SCHEME_BYTE_STRINGP(argv[0]))
scheme_wrong_type("open-input-bytes", "byte string", 0, argc, argv); scheme_wrong_type("open-input-bytes", "byte string", 0, argc, argv);
len = SCHEME_BYTE_STRTAG_VAL(argv[0]);
if (SCHEME_IMMUTABLEP(argv[0]))
len = -len; /* negative means that the string doesn't have to be copied */
o = scheme_make_sized_byte_string_input_port(SCHEME_BYTE_STR_VAL(argv[0]), o = scheme_make_sized_byte_string_input_port(SCHEME_BYTE_STR_VAL(argv[0]),
SCHEME_BYTE_STRTAG_VAL(argv[0])); len);
if (argc > 1) if (argc > 1)
((Scheme_Input_Port *)o)->name = argv[1]; ((Scheme_Input_Port *)o)->name = argv[1];
@ -2461,7 +2469,7 @@ open_input_char_string (int argc, Scheme_Object *argv[])
o = scheme_char_string_to_byte_string(argv[0]); o = scheme_char_string_to_byte_string(argv[0]);
o = scheme_make_sized_byte_string_input_port(SCHEME_BYTE_STR_VAL(o), o = scheme_make_sized_byte_string_input_port(SCHEME_BYTE_STR_VAL(o),
SCHEME_BYTE_STRTAG_VAL(o)); -SCHEME_BYTE_STRTAG_VAL(o));
if (argc > 1) if (argc > 1)
((Scheme_Input_Port *)o)->name = argv[1]; ((Scheme_Input_Port *)o)->name = argv[1];