Created
July 13, 2016 12:29
-
-
Save anonymous/7ce9cb03b5bc6cfe6f96ec6c4940602e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /bin/ruby | |
def main argv | |
n = (argv[0] || 2).to_i rescue 2 | |
m = (argv[1] || 20).to_i rescue 20 | |
g = n_gram n | |
g. | |
enum_for(:each_pair). | |
lazy. | |
sort_by {|k, v| -v }. | |
first(m). | |
each do |k, v| | |
printf("%7d %s\n", v, k.join(' -> ')) | |
end | |
end | |
def n_gram n | |
gram = Hash.new 0 | |
each_iseq_of all_sources do |i| | |
each_sequence i.to_a do |a| | |
insns = a.select{|j| Array === j }.map{|j| j[0] } | |
insns.each_cons n do |c| | |
gram[c] += 1 | |
end | |
end | |
end | |
return gram | |
end | |
def all_sources | |
return $LOADED_FEATURES.grep(/\.rb$/) | |
end | |
def each_iseq_of files | |
files.each do |f| | |
begin | |
i = RubyVM::InstructionSequence.compile_file f, false | |
yield i | |
rescue Errno::ENOENT => e | |
STDERR.printf "%s\n", e.message | |
end | |
end | |
end | |
def each_sequence a | |
return unless a | |
return unless a = a[13] | |
a.each do |i| | |
next unless Array === i | |
j = case i[0] | |
when :putiseq then 1 | |
when :once then 1 | |
when :defineclass then 2 | |
when :send then 3 | |
when :invokesuper then 3 | |
else next | |
end | |
each_sequence i[j] do |b| | |
yield b | |
end | |
end | |
yield a | |
end | |
main ARGV |
N-gram against redmine, on 2.3 because ActiveSupport does not work on trunk yet.
% RUBYOPT=-vW0 RAILS_ENV=production bin/rails runner gistfile1.rb
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin15]
No such file or directory @ rb_sysopen - thread.rb
41060 send -> pop
34709 getlocal -> send
25012 send -> send
23233 putobject -> putstring
21515 putstring -> putobject
20703 putnil -> getconstant
20186 putobject -> send
19741 branchunless -> jump
18607 pop -> putspecialobject
17734 putiseq -> send
17734 putobject -> putiseq
17223 send -> leave
17004 putspecialobject -> putobject
16622 putself -> send
15613 send -> branchunless
13243 putstring -> send
13001 jump -> getlocal
12650 getlocal -> getlocal
11435 pop -> putself
10426 send -> setlocal
3-gram and 4-gram, also against redmine
% RUBYOPT=-vW0 RAILS_ENV=production bin/rails runner gistfile1.rb 3
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin15]
No such file or directory @ rb_sysopen - thread.rb
20688 putstring -> putobject -> putstring
20449 putobject -> putstring -> putobject
17734 putobject -> putiseq -> send
17454 send -> pop -> putspecialobject
16162 putspecialobject -> putobject -> putiseq
15603 send -> branchunless -> jump
15428 putiseq -> send -> pop
14732 pop -> putspecialobject -> putobject
9404 send -> pop -> putself
7582 getlocal -> getlocal -> send
7345 getlocal -> send -> send
7167 branchunless -> jump -> getlocal
6996 getlocal -> putobject -> send
5532 putnil -> getconstant -> send
5432 send -> setlocal -> getlocal
5372 putobject -> send -> pop
4994 send -> pop -> getlocal
4976 putself -> send -> send
4965 getlocal -> send -> leave
4810 putself -> getlocal -> send
% RUBYOPT=-vW0 RAILS_ENV=production bin/rails runner gistfile1.rb 4
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin15]
No such file or directory @ rb_sysopen - thread.rb
20289 putobject -> putstring -> putobject -> putstring
19993 putstring -> putobject -> putstring -> putobject
16162 putspecialobject -> putobject -> putiseq -> send
15428 putobject -> putiseq -> send -> pop
14693 pop -> putspecialobject -> putobject -> putiseq
14573 send -> pop -> putspecialobject -> putobject
13355 putiseq -> send -> pop -> putspecialobject
5515 send -> branchunless -> jump -> getlocal
3871 getlocal -> send -> branchunless -> jump
3710 putobject -> send -> branchunless -> jump
3532 send -> pop -> putself -> putobject
3305 send -> branchunless -> jump -> putself
2980 putspecialobject -> putnil -> defineclass -> leave
2942 send -> send -> branchunless -> jump
2775 putself -> putstring -> send -> pop
2485 putself -> putobject -> send -> pop
2307 putstring -> putstring -> putstring -> putstring
2287 putobject -> putiseq -> send -> leave
2264 putstring -> send -> pop -> putself
2134 putobject -> send -> pop -> putself
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Ruby's N-gram generator. Usage: