Benchs.hx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. typedef Target = {
  2. var name : String;
  3. var out : String;
  4. var cmd : String;
  5. var args : Array<String>;
  6. @:optional var extraArgs : String;
  7. @:optional var startup : Float;
  8. }
  9. class Benchs {
  10. public static function result( v : Dynamic ) {
  11. #if sys
  12. Sys.println(v);
  13. #elseif flash
  14. var t = flash.Lib.getTimer();
  15. var f = new flash.filesystem.File(flash.filesystem.File.applicationDirectory.nativePath + "/flashout.txt");
  16. var o = new flash.filesystem.FileStream();
  17. o.open(f, flash.filesystem.FileMode.WRITE);
  18. o.endian = flash.utils.Endian.LITTLE_ENDIAN;
  19. o.writeFloat(t/1000.);
  20. o.writeUTFBytes(Std.string(v));
  21. o.close();
  22. flash.desktop.NativeApplication.nativeApplication.exit();
  23. #elseif js
  24. untyped console.log(v);
  25. #else
  26. trace(v);
  27. #end
  28. }
  29. #if neko
  30. static function main() {
  31. var isWin = Sys.systemName() == "Windows";
  32. var args = Sys.args();
  33. var is32 = false;
  34. var checkFlash = false;
  35. while( args.length > 0 ) {
  36. switch( args[0] ) {
  37. case "-32":
  38. is32 = true;
  39. case "-swf":
  40. checkFlash = true;
  41. default:
  42. break;
  43. }
  44. args.shift();
  45. }
  46. var selected = args.shift();
  47. var targets : Array<Target> = [
  48. { name : "hl", out : "bench.hl", cmd : "hl", args : ["bench.hl"] },
  49. { name : "hlc", out : "hlc/bench.c", cmd : isWin ? "hlc.exe":"./hlc", args : [] },
  50. { name : "js", out : "bench.js", cmd : "node", args : ["bench.js"] },
  51. { name : "neko", out : "bench.n", cmd : "neko", args : ["bench.n"] },
  52. { name : "cpp", out : "cpp", cmd : "cpp/$name" + (isWin ? ".exe" : ""), args : [], extraArgs : "-D HXCPP_SILENT -D HXCPP_GC_GENERATIONAL" },
  53. ];
  54. if( checkFlash )
  55. targets.push({ name : "swf", out : "bench.swf", cmd : "adl", args : ["bench.air"], extraArgs : "-lib air3" });
  56. var all = [for( f in sys.FileSystem.readDirectory(".") ) if( StringTools.endsWith(f, ".hx") ) f];
  57. all.sort(Reflect.compare);
  58. while( all[all.length - 1].charAt(0) == "_" )
  59. all.unshift(all.pop());
  60. var gcc = "gcc";
  61. if( isWin && is32 )
  62. gcc = "i686-pc-cygwin-gcc";
  63. var useMSVC = isWin;
  64. if( useMSVC ) {
  65. var path = Sys.getEnv("PATH").split(";");
  66. var found = false;
  67. for( p in path )
  68. if( sys.FileSystem.exists(p+"/cl.exe") ) {
  69. if( Sys.getEnv("INCLUDE") == null ) {
  70. Sys.println("INCLUDE env var not set for MSVC, please set and restart");
  71. Sys.exit(1);
  72. }
  73. found = true;
  74. break;
  75. }
  76. if( !found )
  77. useMSVC = false;
  78. }
  79. for( f in all ) {
  80. if( f == "Benchs.hx" ) continue;
  81. var name = f.substr(0, -3);
  82. Sys.println(name);
  83. if( selected != null && selected.toLowerCase() != name.toLowerCase() ) {
  84. Sys.println("\tskip");
  85. continue;
  86. }
  87. var code = sys.io.File.getContent(f);
  88. var result = ~/@:result\(([^)]+)\)/;
  89. var result = result.match(code) ? result.matched(1) : "no result specified";
  90. for( t in targets ) {
  91. Sys.print("\t" + t.name+"...\r");
  92. var hargs = ["-" + (t.name == "hlc" ? "hl" : t.name), t.out, "-main", name, "-dce", "full"];
  93. if( t.extraArgs != null )
  94. for( a in t.extraArgs.split(" ") )
  95. hargs.push(a);
  96. var phaxe = new sys.io.Process("haxe", hargs);
  97. phaxe.stdout.readAll();
  98. if( phaxe.exitCode() != 0 ) {
  99. Sys.println(t.name+" failed to compile");
  100. continue;
  101. }
  102. if( t.name == "hlc" ) {
  103. // build
  104. var cmd;
  105. if( useMSVC )
  106. cmd = 'cl.exe /nologo /Ox /I hlc /I ../../src /Fehlc.exe hlc/bench.c ../../Release/libhl.lib';
  107. else
  108. cmd = '$gcc -O3 ${is32?'-m32':''} -std=c11 -o hlc -I hlc -I ../../src -L ../.. hlc/bench.c -lhl -lm';
  109. if( Sys.command(cmd) != 0 ) {
  110. Sys.println("Failed to run "+cmd);
  111. Sys.println(t.name+" failed to compile");
  112. continue;
  113. }
  114. }
  115. function run() {
  116. var totT = 0., count = 0;
  117. var r = null;
  118. var firstRun = true;
  119. while( totT < 1. ) {
  120. var t0 = haxe.Timer.stamp();
  121. var p = new sys.io.Process(t.cmd.split("$name").join(name),t.args);
  122. var code = try p.exitCode() catch( e : Dynamic ) -99;
  123. if( code != 0 ) {
  124. Sys.println(t.name+" errored with code "+code);
  125. return;
  126. }
  127. var et = haxe.Timer.stamp() - t0;
  128. if( t.name == "swf" ) {
  129. var bytes = sys.io.File.getBytes("flashout.txt");
  130. et = bytes.getFloat(0);
  131. r = StringTools.trim(bytes.sub(4,bytes.length-4).toString());
  132. } else
  133. r = StringTools.trim(p.stdout.readAll().toString());
  134. if( r != result ) {
  135. Sys.println(t.name+" result "+r+" but expected "+result);
  136. return;
  137. }
  138. if (firstRun)
  139. firstRun = false;
  140. else {
  141. totT += et;
  142. count++;
  143. }
  144. }
  145. var et = totT / count;
  146. if( t.startup == null )
  147. t.startup = et;
  148. else
  149. et -= t.startup;
  150. Sys.println("\t" + StringTools.rpad(t.name," ",5) + Std.int(et*100)/100);
  151. }
  152. run();
  153. }
  154. }
  155. }
  156. #end
  157. }