Optcarrot: A NES Emulator for Ruby Benchmark
Project Goals
This project aims to provide an "enjoyable" benchmark for Ruby implementation to drive "Ruby3x3: Ruby 3 will be 3 times faster".
The specific target is a NES (Nintendo Entertainment System) emulator that works at 20 fps in Ruby 2.0. An original NES works at 60 fps. If Ruby3x3 is succeeded, we can enjoy a NES game with Ruby!
NOTE: We do not aim to create a practical NES emulator. There have been already many great emulators available. We recommend you use another emulator if you just want to play a game.
Basic usage
SDL2 is required.
$ git clone http://github.com/mame/optcarrot.git
$ cd optcarrot
$ bin/optcarrot examples/Lan_Master.nes
key | button |
---|---|
arrow | D-pad |
Z |
A button |
X |
B button |
space | Start button |
return | Select button |
See doc/bonus.md
for advanced usage.
Benchmark example
Here is FPS after 3 seconds in the game's clock.
Here is FPS after 50 seconds in the game's clock. (Only fast implementations are listed.)
See doc/benchmark.md
for the measurement condition and some other charts.
See also Ruby Releases Benchmarks and Ruby Commits Benchmarks for the continuous benchmark results.
You may also want to read @eregon's great post for TruffleRuby potential performance after warm-up.
Optimized mode
It may run faster with the option --opt
.
$ bin/optcarrot --opt examples/Lan_Master.nes
This option will generate an optimized (and super-dirty) Ruby code internally, and replace some bottleneck methods with them. See doc/internal.md
in detail.
See also
Acknowledgement
We appreciate all the people who devoted efforts to NES analysis. If it had not been not for the NESdev Wiki, we could not create this program. We also read the source code of Nestopia, NESICIDE, and others. We used the test ROMs due to NESICIDE.