yarv-diff:49
From: ko1 atdot.net
Date: 6 Jul 2005 04:24:16 -0000
Subject: [yarv-diff:49] r204 - in trunk: . benchmark benchmark/contrib benchmark/other-lang rb
Author: ko1
Date: 2005-07-06 13:24:15 +0900 (Wed, 06 Jul 2005)
New Revision: 204
Added:
trunk/benchmark/bm_app_pentomino.rb
trunk/benchmark/other-lang/
trunk/benchmark/other-lang/ack.pl
trunk/benchmark/other-lang/ack.py
trunk/benchmark/other-lang/ack.rb
trunk/benchmark/other-lang/ack.scm
trunk/benchmark/other-lang/eval.rb
trunk/benchmark/other-lang/fact.pl
trunk/benchmark/other-lang/fact.py
trunk/benchmark/other-lang/fact.rb
trunk/benchmark/other-lang/fact.scm
trunk/benchmark/other-lang/fib.pl
trunk/benchmark/other-lang/fib.py
trunk/benchmark/other-lang/fib.rb
trunk/benchmark/other-lang/fib.scm
trunk/benchmark/other-lang/loop.pl
trunk/benchmark/other-lang/loop.py
trunk/benchmark/other-lang/loop.rb
trunk/benchmark/other-lang/loop.scm
trunk/benchmark/other-lang/loop2.rb
trunk/benchmark/other-lang/tak.pl
trunk/benchmark/other-lang/tak.py
trunk/benchmark/other-lang/tak.rb
trunk/benchmark/other-lang/tak.scm
Removed:
trunk/benchmark/contrib/pentomino.rb
Modified:
trunk/ChangeLog
trunk/benchmark/bm_vm2_method.rb
trunk/benchmark/bm_vm2_poly_method.rb
trunk/benchmark/bmx_temp.rb
trunk/depend
trunk/rb/eval.rb
Log:
* depend, rb/eval.rb : add ITEMS option to benchmark rule
* benchmark/* : changed
* benchmark/other-lang/* : added
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/ChangeLog 2005-07-06 04:24:15 UTC (rev 204)
@@ -4,6 +4,15 @@
# from Mon, 03 May 2004 01:24:19 +0900
#
+2005-07-06(Wed) 13:20:27 +0900 Koichi Sasada <ko1 atdot.net>
+
+ * depend, rb/eval.rb : add ITEMS option to benchmark rule
+
+ * benchmark/* : changed
+
+ * benchmark/other-lang/* : added
+
+
2005-07-04(Mon) 04:02:15 +0900 Koichi Sasada <ko1 atdot.net>
* yarvcore.h. yarvcore.c : add idDIV, idMOD, idEq, idLength
Copied: trunk/benchmark/bm_app_pentomino.rb (from rev 196, trunk/benchmark/contrib/pentomino.rb)
Modified: trunk/benchmark/bm_vm2_method.rb
===================================================================
--- trunk/benchmark/bm_vm2_method.rb 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/benchmark/bm_vm2_method.rb 2005-07-06 04:24:15 UTC (rev 204)
@@ -1,8 +1,9 @@
def m
+ nil
end
i=0
while i<6000000 # benchmark loop 2
i+=1
- m; m; m; m; m; m; m; m; m; m
+ m; m; m; m; m; m; m; m;
end
Modified: trunk/benchmark/bm_vm2_poly_method.rb
===================================================================
--- trunk/benchmark/bm_vm2_poly_method.rb 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/benchmark/bm_vm2_poly_method.rb 2005-07-06 04:24:15 UTC (rev 204)
@@ -15,6 +15,6 @@
i=0
while i<6000000 # benchmark loop 2
o = (i % 2 == 0) ? o1 : o2
- o.m; o.m; o.m; o.m; o.m; o.m; o.m; o.m; o.m; o.m
+ o.m; o.m; o.m; o.m; o.m; o.m; o.m; o.m
i+=1
end
Modified: trunk/benchmark/bmx_temp.rb
===================================================================
--- trunk/benchmark/bmx_temp.rb 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/benchmark/bmx_temp.rb 2005-07-06 04:24:15 UTC (rev 204)
@@ -1,11 +1,13 @@
-def m
+def fact(n)
+ if n < 2
+ 1
+ else
+ n * fact(n-1)
+ end
end
-a = 'a'
-b = 'a'
-
i=0
-while i<10000000
+while i<10000
i+=1
- a==b
+ fact(100)
end
Deleted: trunk/benchmark/contrib/pentomino.rb
===================================================================
--- trunk/benchmark/contrib/pentomino.rb 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/benchmark/contrib/pentomino.rb 2005-07-06 04:24:15 UTC (rev 204)
@@ -1,259 +0,0 @@
-#!/usr/local/bin/ruby
-# This program is contributed by Shin Nishiyama
-
-
-# modified by K.Sasada
-
-NP = 5
-ROW = 8 + NP
-COL = 8
-
-$p = []
-$b = []
-$no = 0
-
-def piece(n, a, nb)
- nb.each{|x|
- a[n] = x
- if n == NP-1
- $p << [a.sort]
- else
- nbc=nb.clone
- [-ROW, -1, 1, ROW].each{|d|
- if x+d > 0 and not a.include?(x+d) and not nbc.include?(x+d)
- nbc << x+d
- end
- }
- nbc.delete x
- piece(n+1,a[0..n],nbc)
- end
- }
-end
-
-def kikaku(a)
- a.collect {|x| x - a[0]}
-end
-def ud(a)
- kikaku(a.collect {|x| ((x+NP)%ROW)-ROW*((x+NP)/ROW) }.sort)
-end
-def rl(a)
- kikaku(a.collect {|x| ROW*((x+NP)/ROW)+ROW-((x+NP)%ROW)}.sort)
-end
-def xy(a)
- kikaku(a.collect {|x| ROW*((x+NP)%ROW) + (x+NP)/ROW }.sort)
-end
-
-def mkpieces
- piece(0,[],[0])
- $p.each do |a|
- a0 = a[0]
- a[1] = ud(a0)
- a[2] = rl(a0)
- a[3] = ud(rl(a0))
- a[4] = xy(a0)
- a[5] = ud(xy(a0))
- a[6] = rl(xy(a0))
- a[7] = ud(rl(xy(a0)))
- a.sort!
- a.uniq!
- end
- $p.uniq!.sort! {|x,y| x[0] <=> y[0] }
-end
-
-def mkboard
- (0...ROW*COL).each{|i|
- if i % ROW >= ROW-NP
- $b[i] = -2
- else
- $b[i] = -1
- end
- $b[3*ROW+3]=$b[3*ROW+4]=$b[4*ROW+3]=$b[4*ROW+4]=-2
- }
-end
-
-def pboard
- return # skip print
- print "No. #$no\n"
- (0...COL).each{|i|
- print "|"
- (0...ROW-NP).each{|j|
- x = $b[i*ROW+j]
- if x < 0
- print "..|"
- else
- printf "%2d|",x+1
- end
- }
- print "\n"
- }
- print "\n"
-end
-
-$pnum=[]
-def setpiece(a,pos)
- if a.length == $p.length then
- $no += 1
- pboard
- return
- end
- while $b[pos] != -1
- pos += 1
- end
- ($pnum - a).each do |i|
- $p[i].each do |x|
- f = 0
- x.each{|s|
- if $b[pos+s] != -1
- f=1
- break
- end
- }
- if f == 0 then
- x.each{|s|
- $b[pos+s] = i
- }
- a << i
- setpiece(a.clone, pos)
- a.pop
- x.each{|s|
- $b[pos+s] = -1
- }
- end
- end
- end
-end
-
-mkpieces
-mkboard
-$p[4] = [$p[4][0]]
-$pnum = (0...$p.length).to_a
-setpiece([],0)
-
-
-__END__
-
-# original
-
-NP = 5
-ROW = 8 + NP
-COL = 8
-
-$p = []
-$b = []
-$no = 0
-
-def piece(n,a,nb)
- for x in nb
- a[n] = x
- if n == NP-1
- $p << [a.sort]
- else
- nbc=nb.clone
- for d in [-ROW, -1, 1, ROW]
- if x+d > 0 and not a.include?(x+d) and not nbc.include?(x+d)
- nbc << x+d
- end
- end
- nbc.delete x
- piece(n+1,a[0..n],nbc)
- end
- end
-end
-
-def kikaku(a)
- a.collect {|x| x - a[0]}
-end
-def ud(a)
- kikaku(a.collect {|x| ((x+NP)%ROW)-ROW*((x+NP)/ROW) }.sort)
-end
-def rl(a)
- kikaku(a.collect {|x| ROW*((x+NP)/ROW)+ROW-((x+NP)%ROW)}.sort)
-end
-def xy(a)
- kikaku(a.collect {|x| ROW*((x+NP)%ROW) + (x+NP)/ROW }.sort)
-end
-
-def mkpieces
- piece(0,[],[0])
- $p.each do |a|
- a0 = a[0]
- a[1] = ud(a0)
- a[2] = rl(a0)
- a[3] = ud(rl(a0))
- a[4] = xy(a0)
- a[5] = ud(xy(a0))
- a[6] = rl(xy(a0))
- a[7] = ud(rl(xy(a0)))
- a.sort!
- a.uniq!
- end
- $p.uniq!.sort! {|x,y| x[0] <=> y[0] }
-end
-
-def mkboard
- for i in 0...ROW*COL
- if i % ROW >= ROW-NP
- $b[i] = -2
- else
- $b[i] = -1
- end
- $b[3*ROW+3]=$b[3*ROW+4]=$b[4*ROW+3]=$b[4*ROW+4]=-2
- end
-end
-
-def pboard
- print "No. #$no\n"
- for i in 0...COL
- print "|"
- for j in 0...ROW-NP
- x = $b[i*ROW+j]
- if x < 0
- print "..|"
- else
- printf "%2d|",x+1
- end
- end
- print "\n"
- end
- print "\n"
-end
-
-$pnum=[]
-def setpiece(a,pos)
- if a.length == $p.length then
- $no += 1
- pboard
- return
- end
- while $b[pos] != -1
- pos += 1
- end
- ($pnum - a).each do |i|
- $p[i].each do |x|
- f = 0
- for s in x do
- if $b[pos+s] != -1
- f=1
- break
- end
- end
- if f == 0 then
- for s in x do
- $b[pos+s] = i
- end
- a << i
- setpiece(a.clone, pos)
- a.pop
- for s in x do
- $b[pos+s] = -1
- end
- end
- end
- end
-end
-
-mkpieces
-mkboard
-$p[4] = [$p[4][0]]
-$pnum = (0...$p.length).to_a
-setpiece([],0)
Added: trunk/benchmark/other-lang/ack.pl
===================================================================
--- trunk/benchmark/other-lang/ack.pl 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/benchmark/other-lang/ack.pl 2005-07-06 04:24:15 UTC (rev 204)
@@ -0,0 +1,11 @@
+use integer;
+
+sub Ack {
+ return $_[0] ? ($_[1] ? Ack($_[0]-1, Ack($_[0], $_[1]-1))
+ : Ack($_[0]-1, 1))
+ : $_[1]+1;
+}
+
+my $NUM = 9;
+$NUM = 1 if ($NUM < 1);
+my $ack = Ack(3, $NUM);
Added: trunk/benchmark/other-lang/ack.py
===================================================================
--- trunk/benchmark/other-lang/ack.py 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/benchmark/other-lang/ack.py 2005-07-06 04:24:15 UTC (rev 204)
@@ -0,0 +1,16 @@
+import sys
+sys.setrecursionlimit(5000000)
+
+def Ack(M, N):
+ if (not M):
+ return( N + 1 )
+ if (not N):
+ return( Ack(M-1, 1) )
+ return( Ack(M-1, Ack(M, N-1)) )
+
+def main():
+ NUM = 9
+ sys.setrecursionlimit(10000)
+ Ack(3, NUM)
+
+main()
Added: trunk/benchmark/other-lang/ack.rb
===================================================================
--- trunk/benchmark/other-lang/ack.rb 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/benchmark/other-lang/ack.rb 2005-07-06 04:24:15 UTC (rev 204)
@@ -0,0 +1,12 @@
+def ack(m, n)
+ if m == 0 then
+ n + 1
+ elsif n == 0 then
+ ack(m - 1, 1)
+ else
+ ack(m - 1, ack(m, n - 1))
+ end
+end
+
+NUM = 9
+ack(3, NUM)
Added: trunk/benchmark/other-lang/ack.scm
===================================================================
--- trunk/benchmark/other-lang/ack.scm 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/benchmark/other-lang/ack.scm 2005-07-06 04:24:15 UTC (rev 204)
@@ -0,0 +1,7 @@
+(define (ack m n)
+ (cond ((zero? m) (+ n 1))
+ ((zero? n) (ack (- m 1) 1))
+ (else (ack (- m 1) (ack m (- n 1))))))
+
+(ack 3 9)
+
Added: trunk/benchmark/other-lang/eval.rb
===================================================================
--- trunk/benchmark/other-lang/eval.rb 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/benchmark/other-lang/eval.rb 2005-07-06 04:24:15 UTC (rev 204)
@@ -0,0 +1,68 @@
+
+Bench = %w(
+ loop2); %w(
+ ack
+ fib
+ tak
+ fact
+)
+
+Lang = <<EOP.map{|l| l.strip}
+ yruby
+ yruby -I../rubyext/yarv/cygwin -I../rubyext/yarv -rite
+EOP
+<<EOP
+ perl
+ python
+ gosh
+EOP
+
+Ext = %w(
+ .rb
+ .rb
+ .pl
+ .py
+ .scm
+)
+
+p Bench
+p Lang
+
+
+require 'benchmark'
+
+def bench cmd
+ m = Benchmark.measure{
+ # cmd
+ #p cmd
+# p cmd
+ system(cmd)
+ }
+ [m.utime, m.real]
+end
+
+Result = []
+Bench.each{|b|
+ r = []
+ Lang.each_with_index{|l, idx|
+ cmd = "#{l} #{b}#{Ext[idx]}"
+ r << bench(cmd)
+ }
+ Result << r
+}
+
+require 'pp'
+# utime
+puts Lang.join("\t")
+Bench.each_with_index{|b, bi|
+ print b, "\t"
+ puts Result[bi].map{|e| e[0]}.join("\t")
+}
+
+# rtime
+puts Lang.join("\t")
+Bench.each_with_index{|b, bi|
+ print b, "\t"
+ puts Result[bi].map{|e| e[1]}.join("\t")
+}
+
Added: trunk/benchmark/other-lang/fact.pl
===================================================================
--- trunk/benchmark/other-lang/fact.pl 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/benchmark/other-lang/fact.pl 2005-07-06 04:24:15 UTC (rev 204)
@@ -0,0 +1,13 @@
+sub fact{
+ my $n = @_[0];
+ if($n < 2){
+ return 1;
+ }
+ else{
+ return $n * fact($n-1);
+ }
+}
+
+for($i=0; $i<10000; $i++){
+ &fact(100);
+}
Added: trunk/benchmark/other-lang/fact.py
===================================================================
--- trunk/benchmark/other-lang/fact.py 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/benchmark/other-lang/fact.py 2005-07-06 04:24:15 UTC (rev 204)
@@ -0,0 +1,18 @@
+#import sys
+#sys.setrecursionlimit(1000)
+
+def factL(n):
+ r = 1
+ for x in range(2, n):
+ r *= x
+ return r
+
+def factR(n):
+ if n < 2:
+ return 1
+ else:
+ return n * factR(n-1)
+
+for i in range(10000):
+ factR(100)
+
Added: trunk/benchmark/other-lang/fact.rb
===================================================================
--- trunk/benchmark/other-lang/fact.rb 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/benchmark/other-lang/fact.rb 2005-07-06 04:24:15 UTC (rev 204)
@@ -0,0 +1,13 @@
+def fact(n)
+ if n < 2
+ 1
+ else
+ n * fact(n-1)
+ end
+end
+
+i=0
+while i<10000
+ i+=1
+ fact(100)
+end
Added: trunk/benchmark/other-lang/fact.scm
===================================================================
--- trunk/benchmark/other-lang/fact.scm 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/benchmark/other-lang/fact.scm 2005-07-06 04:24:15 UTC (rev 204)
@@ -0,0 +1,8 @@
+(define (fact n)
+ (if (< n 2)
+ 1
+ (* n (fact (- n 1)))))
+
+(dotimes (i 10000)
+ (fact 100))
+
Added: trunk/benchmark/other-lang/fib.pl
===================================================================
--- trunk/benchmark/other-lang/fib.pl 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/benchmark/other-lang/fib.pl 2005-07-06 04:24:15 UTC (rev 204)
@@ -0,0 +1,11 @@
+sub fib{
+ my $n = $_[0];
+ if($n < 3){
+ return 1;
+ }
+ else{
+ return fib($n-1) + fib($n-2);
+ }
+};
+
+&fib(34);
Added: trunk/benchmark/other-lang/fib.py
===================================================================
--- trunk/benchmark/other-lang/fib.py 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/benchmark/other-lang/fib.py 2005-07-06 04:24:15 UTC (rev 204)
@@ -0,0 +1,7 @@
+def fib(n):
+ if n < 3:
+ return 1
+ else:
+ return fib(n-1) + fib(n-2)
+
+fib(34)
Added: trunk/benchmark/other-lang/fib.rb
===================================================================
--- trunk/benchmark/other-lang/fib.rb 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/benchmark/other-lang/fib.rb 2005-07-06 04:24:15 UTC (rev 204)
@@ -0,0 +1,9 @@
+def fib n
+ if n < 3
+ 1
+ else
+ fib(n-1) + fib(n-2)
+ end
+end
+
+fib(34)
Added: trunk/benchmark/other-lang/fib.scm
===================================================================
--- trunk/benchmark/other-lang/fib.scm 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/benchmark/other-lang/fib.scm 2005-07-06 04:24:15 UTC (rev 204)
@@ -0,0 +1,7 @@
+(define (fib n)
+ (if (< n 3)
+ 1
+ (+ (fib (- n 1)) (fib (- n 2)))))
+
+(fib 34)
+
Added: trunk/benchmark/other-lang/loop.pl
===================================================================
--- trunk/benchmark/other-lang/loop.pl 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/benchmark/other-lang/loop.pl 2005-07-06 04:24:15 UTC (rev 204)
@@ -0,0 +1,3 @@
+for($i=0; $i<30000000; $i++){
+}
+
Added: trunk/benchmark/other-lang/loop.py
===================================================================
--- trunk/benchmark/other-lang/loop.py 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/benchmark/other-lang/loop.py 2005-07-06 04:24:15 UTC (rev 204)
@@ -0,0 +1,2 @@
+for i in xrange(30000000):
+ pass
Added: trunk/benchmark/other-lang/loop.rb
===================================================================
--- trunk/benchmark/other-lang/loop.rb 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/benchmark/other-lang/loop.rb 2005-07-06 04:24:15 UTC (rev 204)
@@ -0,0 +1,4 @@
+i=0
+while i<30000000
+ i+=1
+end
Added: trunk/benchmark/other-lang/loop.scm
===================================================================
--- trunk/benchmark/other-lang/loop.scm 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/benchmark/other-lang/loop.scm 2005-07-06 04:24:15 UTC (rev 204)
@@ -0,0 +1 @@
+(dotimes (x 30000000))
Added: trunk/benchmark/other-lang/loop2.rb
===================================================================
--- trunk/benchmark/other-lang/loop2.rb 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/benchmark/other-lang/loop2.rb 2005-07-06 04:24:15 UTC (rev 204)
@@ -0,0 +1 @@
+30000000.times{}
Added: trunk/benchmark/other-lang/tak.pl
===================================================================
--- trunk/benchmark/other-lang/tak.pl 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/benchmark/other-lang/tak.pl 2005-07-06 04:24:15 UTC (rev 204)
@@ -0,0 +1,11 @@
+sub tak {
+ local($x, $y, $z) = @_;
+ if (!($y < $x)) {
+ return $z;
+ } else {
+ return &tak(&tak($x - 1, $y, $z),
+ &tak($y - 1, $z, $x),
+ &tak($z - 1, $x, $y));
+ }
+}
+&tak(18, 9, 0);
Added: trunk/benchmark/other-lang/tak.py
===================================================================
--- trunk/benchmark/other-lang/tak.py 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/benchmark/other-lang/tak.py 2005-07-06 04:24:15 UTC (rev 204)
@@ -0,0 +1,8 @@
+def tak(x, y, z):
+ if not(y<x):
+ return z
+ else:
+ return tak(tak(x-1, y, z),
+ tak(y-1, z, x),
+ tak(z-1, x, y))
+tak(18, 9, 0)
Added: trunk/benchmark/other-lang/tak.rb
===================================================================
--- trunk/benchmark/other-lang/tak.rb 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/benchmark/other-lang/tak.rb 2005-07-06 04:24:15 UTC (rev 204)
@@ -0,0 +1,13 @@
+
+def tak x, y, z
+ unless y < x
+ z
+ else
+ tak( tak(x-1, y, z),
+ tak(y-1, z, x),
+ tak(z-1, x, y))
+ end
+end
+
+tak(18, 9, 0)
+
Added: trunk/benchmark/other-lang/tak.scm
===================================================================
--- trunk/benchmark/other-lang/tak.scm 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/benchmark/other-lang/tak.scm 2005-07-06 04:24:15 UTC (rev 204)
@@ -0,0 +1,10 @@
+(define (tak x y z)
+ (if (not (< y x))
+ z
+ (tak (tak (- x 1) y z)
+ (tak (- y 1) z x)
+ (tak (- z 1) x y))))
+
+(tak 18 9 0)
+
+
Modified: trunk/depend
===================================================================
--- trunk/depend 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/depend 2005-07-06 04:24:15 UTC (rev 204)
@@ -55,7 +55,7 @@
$(RUBY) -I$(srcdir) $(srcdir)/test.rb $(RUNOPT)
benchmark: all
- $(RUBY) -I$(srcdir) $(srcdir)/benchmark/run.rb $(OPT)
+ $(RUBY) -I$(srcdir) $(srcdir)/benchmark/run.rb $(OPT) $(ITEMS)
ITEM=bmx_temp
tbench: all
Modified: trunk/rb/eval.rb
===================================================================
--- trunk/rb/eval.rb 2005-07-03 22:15:59 UTC (rev 203)
+++ trunk/rb/eval.rb 2005-07-06 04:24:15 UTC (rev 204)
@@ -30,6 +30,7 @@
def exec_cmd(cmd)
+ puts cmd
unless system(cmd)
p cmd
raise "error"
@@ -64,7 +65,7 @@
5.times{|count|
print count
FileUtils.cd(dirname(idx)){
- exec_cmd("make benchmark OPT=-y > ../b#{idx}-#{count}")
+ exec_cmd("make benchmark OPT=-y ITEMS=#{ENV['ITEMS']} > ../b#{idx}-#{count}")
}
}
puts
--
ML: yarv-diff quickml.atdot.net
Info: http://www.atdot.net/~ko1/quickml