ee4fa4ccee
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 |
||
---|---|---|
.github | ||
basictest | ||
benchmark | ||
bin | ||
bootstraptest | ||
ccan | ||
coroutine | ||
coverage | ||
cygwin | ||
defs | ||
doc | ||
enc | ||
ext | ||
gc | ||
gems | ||
include | ||
internal | ||
lib | ||
libexec | ||
man | ||
misc | ||
missing | ||
prism | ||
sample | ||
spec | ||
template | ||
test | ||
tool | ||
wasm | ||
win32 | ||
yjit | ||
.dir-locals.el | ||
.document | ||
.editorconfig | ||
.gdbinit | ||
.git-blame-ignore-revs | ||
.gitattributes | ||
.gitignore | ||
.indent.pro | ||
.mailmap | ||
.rdoc_options | ||
.rspec_parallel | ||
.travis.yml | ||
BSDL | ||
CONTRIBUTING.md | ||
COPYING | ||
COPYING.ja | ||
GPL | ||
KNOWNBUGS.rb | ||
LEGAL | ||
NEWS.md | ||
README.EXT | ||
README.EXT.ja | ||
README.ja.md | ||
README.md | ||
aclocal.m4 | ||
addr2line.c | ||
addr2line.h | ||
array.c | ||
array.rb | ||
ast.c | ||
ast.rb | ||
autogen.sh | ||
bignum.c | ||
builtin.c | ||
builtin.h | ||
class.c | ||
common.mk | ||
compar.c | ||
compile.c | ||
complex.c | ||
configure.ac | ||
constant.h | ||
cont.c | ||
darray.h | ||
debug.c | ||
debug_counter.c | ||
debug_counter.h | ||
dir.c | ||
dir.rb | ||
dln.c | ||
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 | ||
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 | ||
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 | ||
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 | ||
ractor.rb | ||
ractor_core.h | ||
random.c | ||
range.c | ||
rational.c | ||
re.c | ||
regcomp.c | ||
regenc.c | ||
regenc.h | ||
regerror.c | ||
regexec.c | ||
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 | ||
rubyparser.h | ||
rubystub.c | ||
scheduler.c | ||
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 | ||
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 | ||
util.c | ||
variable.c | ||
variable.h | ||
vcpkg.json | ||
version.c | ||
version.h | ||
vm.c | ||
vm_args.c | ||
vm_backtrace.c | ||
vm_callinfo.h | ||
vm_core.h | ||
vm_debug.h | ||
vm_dump.c | ||
vm_eval.c | ||
vm_exec.c | ||
vm_exec.h | ||
vm_insnhelper.c | ||
vm_insnhelper.h | ||
vm_method.c | ||
vm_opts.h | ||
vm_sync.c | ||
vm_sync.h | ||
vm_trace.c | ||
vsnprintf.c | ||
warning.rb | ||
weakmap.c | ||
yjit.c | ||
yjit.h | ||
yjit.rb |
README.md
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
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.