development fork of ruby/ruby
Перейти к файлу
Jean Boussier ee4fa4ccee [ruby/json] json_string_unescape: Use the returned RString as buffer
Rather than to copy into a buffer to unescape and then copy that
buffer into the final string, we can directly copy into the final
string.

The downside is that if the string contains a lot of escaping, we
end up returning a string that's larger than strictly necessary, but
it's probably fine.

Before:

```
== Parsing twitter.json (567916 bytes)
ruby 3.3.4 (2024-07-09 revision https://github.com/ruby/json/commit/be1089c8ec) +YJIT [arm64-darwin23]
Warming up --------------------------------------
                json    56.000 i/100ms
                  oj    58.000 i/100ms
           oj strict    74.000 i/100ms
          Oj::Parser    76.000 i/100ms
           rapidjson    52.000 i/100ms
Calculating -------------------------------------
                json    556.659 (± 2.9%) i/s    (1.80 ms/i) -      2.800k in   5.034719s
                  oj    604.077 (± 3.8%) i/s    (1.66 ms/i) -      3.016k in   5.001546s
           oj strict    706.942 (± 3.5%) i/s    (1.41 ms/i) -      3.552k in   5.030954s
          Oj::Parser    752.917 (± 3.2%) i/s    (1.33 ms/i) -      3.800k in   5.052707s
           rapidjson    546.470 (± 3.5%) i/s    (1.83 ms/i) -      2.756k in   5.049855s

Comparison:
                json:      556.7 i/s
          Oj::Parser:      752.9 i/s - 1.35x  faster
           oj strict:      706.9 i/s - 1.27x  faster
                  oj:      604.1 i/s - 1.09x  faster
           rapidjson:      546.5 i/s - same-ish: difference falls within error

== Parsing citm_catalog.json (1727030 bytes)
ruby 3.3.4 (2024-07-09 revision https://github.com/ruby/json/commit/be1089c8ec) +YJIT [arm64-darwin23]
Warming up --------------------------------------
                json    29.000 i/100ms
                  oj    32.000 i/100ms
           oj strict    38.000 i/100ms
          Oj::Parser    42.000 i/100ms
           rapidjson    38.000 i/100ms
Calculating -------------------------------------
                json    317.858 (± 3.1%) i/s    (3.15 ms/i) -      1.595k in   5.023245s
                  oj    348.168 (± 2.6%) i/s    (2.87 ms/i) -      1.760k in   5.058431s
           oj strict    394.599 (± 2.8%) i/s    (2.53 ms/i) -      1.976k in   5.012073s
          Oj::Parser    403.771 (± 3.0%) i/s    (2.48 ms/i) -      2.058k in   5.101578s
           rapidjson    383.441 (± 3.7%) i/s    (2.61 ms/i) -      1.938k in   5.061355s

Comparison:
                json:      317.9 i/s
          Oj::Parser:      403.8 i/s - 1.27x  faster
           oj strict:      394.6 i/s - 1.24x  faster
           rapidjson:      383.4 i/s - 1.21x  faster
                  oj:      348.2 i/s - 1.10x  faster
```

After:

```
== Parsing twitter.json (567916 bytes)
ruby 3.3.4 (2024-07-09 revision https://github.com/ruby/json/commit/be1089c8ec) +YJIT [arm64-darwin23]
Warming up --------------------------------------
                json    56.000 i/100ms
                  oj    62.000 i/100ms
           oj strict    73.000 i/100ms
          Oj::Parser    76.000 i/100ms
           rapidjson    54.000 i/100ms
Calculating -------------------------------------
                json    561.009 (± 7.5%) i/s    (1.78 ms/i) -      2.800k in   5.039548s
                  oj    601.124 (± 4.3%) i/s    (1.66 ms/i) -      3.038k in   5.064686s
           oj strict    707.455 (± 3.4%) i/s    (1.41 ms/i) -      3.577k in   5.062540s
          Oj::Parser    751.799 (± 3.1%) i/s    (1.33 ms/i) -      3.800k in   5.059509s
           rapidjson    535.641 (± 3.2%) i/s    (1.87 ms/i) -      2.700k in   5.045816s

Comparison:
                json:      561.0 i/s
          Oj::Parser:      751.8 i/s - 1.34x  faster
           oj strict:      707.5 i/s - 1.26x  faster
                  oj:      601.1 i/s - same-ish: difference falls within error
           rapidjson:      535.6 i/s - same-ish: difference falls within error

== Parsing citm_catalog.json (1727030 bytes)
ruby 3.3.4 (2024-07-09 revision https://github.com/ruby/json/commit/be1089c8ec) +YJIT [arm64-darwin23]
Warming up --------------------------------------
                json    30.000 i/100ms
                  oj    32.000 i/100ms
           oj strict    36.000 i/100ms
          Oj::Parser    42.000 i/100ms
           rapidjson    39.000 i/100ms
Calculating -------------------------------------
                json    313.248 (± 7.3%) i/s    (3.19 ms/i) -      1.560k in   5.014118s
                  oj    341.977 (± 4.1%) i/s    (2.92 ms/i) -      1.728k in   5.063332s
           oj strict    387.062 (± 6.2%) i/s    (2.58 ms/i) -      1.944k in   5.045961s
          Oj::Parser    400.423 (± 4.0%) i/s    (2.50 ms/i) -      2.016k in   5.044513s
           rapidjson    379.046 (± 6.1%) i/s    (2.64 ms/i) -      1.911k in   5.064461s

Comparison:
                json:      313.2 i/s
          Oj::Parser:      400.4 i/s - 1.28x  faster
           oj strict:      387.1 i/s - 1.24x  faster
           rapidjson:      379.0 i/s - 1.21x  faster
                  oj:      342.0 i/s - same-ish: difference falls within error
```

https://github.com/ruby/json/commit/5e1ec4a268
2024-11-01 13:04:24 +09:00
.github Bump actions/checkout in /.github/actions/setup/directories 2024-10-24 11:47:18 +09:00
basictest
benchmark Elide Generator::State allocation until a `to_json` method has to be called 2024-11-01 13:04:24 +09:00
bin
bootstraptest
ccan
coroutine
coverage
cygwin
defs
doc [ruby/strscan] [DOC] doc/strscan/strscan.md - fix triple backtick 2024-10-29 13:52:22 +09:00
enc
ext [ruby/json] json_string_unescape: Use the returned RString as buffer 2024-11-01 13:04:24 +09:00
gc [DOC] Fix typos 2024-10-31 12:44:50 +09:00
gems Use net-imap 0.5.0 for tests 2024-11-01 02:33:11 +09:00
include Introduce Fiber Scheduler `blocking_region` hook. (#11963) 2024-10-31 17:26:37 +13:00
internal Fix shared GC with -DRUBY_DEBUG 2024-10-24 16:08:46 +01:00
lib [ruby/json] Move State#configure back into C 2024-11-01 13:04:24 +09:00
libexec
man
misc
missing
prism [ruby/prism] Only read from buffer if `size` is greater than 0 2024-10-28 20:38:20 +00:00
sample
spec [rubygems/rubygems] Add useful error message for plugin load 2024-10-31 17:10:31 +00:00
template
test JSON.generate: call to_json on String subclasses 2024-11-01 13:04:24 +09:00
tool Remove debug print 2024-11-01 02:33:11 +09:00
wasm
win32 Win32: Refactor configurations 2024-10-28 17:27:40 +09:00
yjit YJIT: Make PendingBranch::set_target `must_use` [ci skip] 2024-10-23 10:20:44 -04:00
.dir-locals.el
.document
.editorconfig
.gdbinit
.git-blame-ignore-revs
.gitattributes
.gitignore
.indent.pro
.mailmap
.rdoc_options
.rspec_parallel
.travis.yml .travis.yml: Skip document only commit and merge for bot 2024-10-25 07:05:56 +02:00
BSDL
CONTRIBUTING.md
COPYING
COPYING.ja
GPL
KNOWNBUGS.rb
LEGAL
NEWS.md Introduce Fiber Scheduler `blocking_region` hook. (#11963) 2024-10-31 17:26:37 +13:00
README.EXT
README.EXT.ja
README.ja.md
README.md
aclocal.m4
addr2line.c
addr2line.h
array.c [DOC] Tweaks for Array#uniq (#11949) 2024-10-28 10:05:49 -04:00
array.rb
ast.c
ast.rb
autogen.sh
bignum.c
builtin.c
builtin.h
class.c
common.mk Tweaks for actions groups 2024-11-01 02:33:11 +09:00
compar.c
compile.c
complex.c
configure.ac Check if -pipe option works 2024-10-23 23:02:15 +09:00
constant.h
cont.c
darray.h
debug.c
debug_counter.c
debug_counter.h
dir.c
dir.rb
dln.c Avoid dangling pointer on cygwin 2024-10-25 20:52:32 +09:00
dln.h
dln_find.c
dmydln.c
dmyenc.c
dmyext.c
encindex.h
encoding.c
enum.c
enumerator.c
error.c
eval.c
eval_error.c
eval_intern.h
eval_jump.c
file.c
gc.c Move error handling for GC.stat_heap to gc.c 2024-10-23 13:18:09 -04:00
gc.rb
gem_prelude.rb
golf_prelude.rb
goruby.c
hash.c
hash.rb
hrtime.h
id_table.c
id_table.h
imemo.c
inits.c Make builtin init ifdefs consistent 2024-10-25 17:46:49 -07:00
insns.def
internal.h
io.c
io.rb
io_buffer.c
iseq.c
iseq.h
kernel.rb
lex.c.blt
load.c
loadpath.c
localeinit.c
main.c
marshal.c
marshal.rb
math.c
memory_view.c
method.h
mini_builtin.c
miniinit.c
nilclass.rb
node.c
node.h
node_dump.c
numeric.c
numeric.rb
object.c
pack.c
pack.rb
parse.y Introduce inline_primary rule 2024-10-25 22:26:29 +09:00
parser_bits.h
parser_node.h
parser_st.c
parser_st.h
parser_value.h
prelude.rb
prism_compile.c
prism_compile.h
prism_init.c
probes.d
probes_helper.h
proc.c
process.c
ractor.c Fix shared GC with -DRUBY_DEBUG 2024-10-24 16:08:46 +01:00
ractor.rb
ractor_core.h
random.c
range.c
rational.c
re.c
regcomp.c
regenc.c
regenc.h
regerror.c
regexec.c [DOC] Fix typos 2024-10-31 12:44:50 +09:00
regint.h
regparse.c
regparse.h
regsyntax.c
rjit.c
rjit.h
rjit.rb
rjit_c.c
rjit_c.h
rjit_c.rb
ruby-runner.c
ruby.c
ruby_assert.h
ruby_atomic.h
ruby_parser.c Remove rb_ary_new for parser 2024-10-25 22:32:38 +09:00
rubyparser.h Remove rb_ary_new for parser 2024-10-25 22:32:38 +09:00
rubystub.c
scheduler.c Introduce Fiber Scheduler `blocking_region` hook. (#11963) 2024-10-31 17:26:37 +13:00
shape.c
shape.h
signal.c
siphash.c
siphash.h
sparc.c
sprintf.c
st.c
strftime.c
string.c
string.rb
struct.c
symbol.c
symbol.h
symbol.rb
thread.c Introduce Fiber Scheduler `blocking_region` hook. (#11963) 2024-10-31 17:26:37 +13:00
thread_none.c
thread_none.h
thread_pthread.c
thread_pthread.h
thread_pthread_mn.c
thread_sync.c
thread_sync.rb
thread_win32.c
thread_win32.h
time.c
timev.h
timev.rb
trace_point.rb
transcode.c
transcode_data.h
universal_parser.c Remove rb_ary_new for parser 2024-10-25 22:32:38 +09:00
util.c
variable.c
variable.h
vcpkg.json
version.c
version.h
vm.c Remove vm_assert_env 2024-10-31 13:52:24 -04:00
vm_args.c
vm_backtrace.c
vm_callinfo.h
vm_core.h Remove vm_assert_env 2024-10-31 13:52:24 -04:00
vm_debug.h
vm_dump.c
vm_eval.c
vm_exec.c
vm_exec.h
vm_insnhelper.c Define `VM_ASSERT_TYPE` macros 2024-10-31 22:12:16 +09:00
vm_insnhelper.h
vm_method.c `alias` should not set `defined_class` for Modules 2024-11-01 11:50:00 +09:00
vm_opts.h
vm_sync.c
vm_sync.h
vm_trace.c
vsnprintf.c
warning.rb
weakmap.c Remove double semicolon at end of line in weakmap.c [ci skip] 2024-10-29 15:20:09 -04:00
yjit.c
yjit.h
yjit.rb

README.md

Actions Status: MinGW Actions Status: RJIT Actions Status: Ubuntu Actions Status: Windows Travis Status

What is Ruby?

Ruby is an interpreted object-oriented programming language often used for web development. It also offers many scripting features to process plain text and serialized files, or manage system tasks. It is simple, straightforward, and extensible.

Features of Ruby

  • Simple Syntax
  • Normal Object-oriented Features (e.g. class, method calls)
  • Advanced Object-oriented Features (e.g. mix-in, singleton-method)
  • Operator Overloading
  • Exception Handling
  • Iterators and Closures
  • Garbage Collection
  • Dynamic Loading of Object Files (on some architectures)
  • Highly Portable (works on many Unix-like/POSIX compatible platforms as well as Windows, macOS, etc.) cf. https://docs.ruby-lang.org/en/master/maintainers_md.html#label-Platform+Maintainers

How to get Ruby

For a complete list of ways to install Ruby, including using third-party tools like rvm, see:

https://www.ruby-lang.org/en/downloads/

You can download release packages and the snapshot of the repository. If you want to download whole versions of Ruby, please visit https://www.ruby-lang.org/en/downloads/releases/.

Download with Git

The mirror of the Ruby source tree can be checked out with the following command:

$ git clone https://github.com/ruby/ruby.git

There are some other branches under development. Try the following command to see the list of branches:

$ git ls-remote https://github.com/ruby/ruby.git

You may also want to use https://git.ruby-lang.org/ruby.git (actual master of Ruby source) if you are a committer.

How to build

See Building Ruby

Ruby home page

https://www.ruby-lang.org/

Documentation

Mailing list

There is a mailing list to discuss Ruby. To subscribe to this list, please send the following phrase:

join

in the mail subject (not body) to the address ruby-talk-request@ml.ruby-lang.org.

Copying

See the file COPYING.

Feedback

Questions about the Ruby language can be asked on the Ruby-Talk mailing list or on websites like https://stackoverflow.com.

Bugs should be reported at https://bugs.ruby-lang.org. Read "Reporting Issues" for more information.

Contributing

See "Contributing to Ruby", which includes setup and build instructions.

The Author

Ruby was originally designed and developed by Yukihiro Matsumoto (Matz) in 1995.

matz@ruby-lang.org