@@ -42,20 +42,37 @@ const AGENT = "Meta Miner " + VERSION;
4242// the multiplier is for supporting hashrate prints in different units
4343// the nr benchmark prints is to make sure hashrate has stabilized before snapping the benchmark value
4444const hashrate_regexes = [
45- [ 1 , 1 , / \[ [ ^ \] ] + \] s p e e d 2 .5 s \/ 6 0 s \/ 1 5 m [ \d \. ] + ( [ \d \. ] + ) \s / ] , // for old xmrig
46- [ 1 , 1 , / \[ [ ^ \] ] + \] s p e e d 1 0 s \/ 6 0 s \/ 1 5 m [ \d \. n / a ] + ( [ \d \. ] + ) \s / ] , // for new xmrig
47- [ 1 , 1 , / \s + m i n e r \s + s p e e d 1 0 s \/ 6 0 s \/ 1 5 m [ \d \. n / a ] + ( [ \d \. ] + ) \s / ] , // for xmrig v6+
48- [ 1 , 1 , / T o t a l s \( A L L \) : \s + [ \d \. ] + \s + ( [ 1 - 9 ] \d * \. \d + | 0 \. [ 1 - 9 ] \d * ) \s / ] , // xmr-stak
49- [ 1 , 1 , / T o t a l S p e e d : ( [ \d \. ] + ) H \/ s , / ] , // claymore
50- [ 1 , 1 , / \( A v r ( [ \d \. ] + ) H \/ s \) / ] , // CryptoDredge
51- [ 1e3 , 3 , / T o t a l [ ^ : ] + : \s * ( [ \d \. ] + ) \s * k h \/ s / ] , // TeamRedMiner variant 1 (kh/s)
52- [ 1 , 3 , / T o t a l [ ^ : ] + : \s * ( [ \d \. ] + ) \s * h \/ s / ] , // TeamRedMiner variant 2 (h/s)
53- [ 1 , 1 , / M i n i n g a t \s + ( [ \d \. ] + ) g p s / ] , // tube4referenceMiner (use mode=rolling command line option)
54- [ 1 , 1 , / m i n i n g a t \s + ( [ \d \. ] + ) g p s / ] , // SwapReferenceMiner (use mode=rolling command line option)
55- [ 1 , 2 , / T o t a l \s + : \s + ( [ \d \. ] + ) g p s / ] , // MoneroVMiner
56- [ 1 , 2 , / ( [ \d \. ] + ) G \/ s / ] , // gminer
57- [ 1000000 , 2 , / ( [ \d \. ] + ) M H \/ s / ] , // gminer
45+ [ 1 , 1 , / \[ [ ^ \] ] + \] s p e e d 2 .5 s \/ 6 0 s \/ 1 5 m [ \d \. ] + ( [ \d \. ] + ) \s / , 'xmrig old' ] ,
46+ [ 1 , 1 , / \[ [ ^ \] ] + \] s p e e d 1 0 s \/ 6 0 s \/ 1 5 m [ \d \. n / a ] + ( [ \d \. ] + ) \s / , 'xmrig new' ] ,
47+ [ 1 , 1 , / \s + m i n e r \s + s p e e d 1 0 s \/ 6 0 s \/ 1 5 m [ \d \. n / a ] + ( [ \d \. ] + ) \s / , 'xmrig v6+' ] ,
48+ [ 1 , 1 , / T o t a l s \( A L L \) : \s + [ \d \. ] + \s + ( [ 1 - 9 ] \d * \. \d + | 0 \. [ 1 - 9 ] \d * ) \s / , 'xmr-stak' ] ,
49+ [ 1 , 1 , / T o t a l S p e e d : ( [ \d \. ] + ) H \/ s , / , 'claymore' ] ,
50+ [ 1 , 1 , / \( A v r ( [ \d \. ] + ) H \/ s \) / , 'CryptoDredge' ] ,
51+ [ 1e3 , 3 , / T o t a l [ ^ : ] + : \s * ( [ \d \. ] + ) \s * k h \/ s / , 'TeamRedMiner variant 1 (kh/s)' ] ,
52+ [ 1 , 3 , / T o t a l [ ^ : ] + : \s * ( [ \d \. ] + ) \s * h \/ s / , 'TeamRedMiner variant 2 (h/s)' ] ,
53+ [ 1 , 1 , / M i n i n g a t \s + ( [ \d \. ] + ) g p s / , 'tube4referenceMiner (use mode=rolling command line option)' ] ,
54+ [ 1 , 1 , / m i n i n g a t \s + ( [ \d \. ] + ) g p s / , 'SwapReferenceMiner (use mode=rolling command line option)' ] ,
55+ [ 1 , 2 , / T o t a l \s + : \s + ( [ \d \. ] + ) g p s / , 'MoneroVMiner' ] ,
56+ [ 1 , 2 , / ^ \| .* [ ^ \d \. ] ( [ \d \. ] + ) G \/ s .* \| $ / , 'gminer (gh/s)' ] ,
57+ [ 1e6 , 2 , / ^ \| .* [ ^ \d \. ] ( [ \d \. ] + ) M \/ s .* \| $ / , 'gminer (mh/s)' ] ,
58+ [ 1 , 2 , / ^ e t h m i n e r .* ( [ \d \. ] + ) h - / , 'ethminer (h/s)' ] ,
59+ [ 1e3 , 2 , / ^ e t h m i n e r .* ( [ \d \. ] + ) K h - / , 'ethminer (kh/s)' ] ,
60+ [ 1e6 , 2 , / ^ e t h m i n e r .* ( [ \d \. ] + ) M h - / , 'ethminer (mh/s)' ] ,
61+ [ 1e9 , 2 , / ^ e t h m i n e r .* ( [ \d \. ] + ) G h - / , 'ethminer (gh/s)' ] ,
62+ [ 1 , 2 , / ^ G P U # \d + : .* - ( [ \d \. ] + ) H \/ s / , 'T-Rex (h/s)' ] ,
63+ [ 1e3 , 2 , / ^ G P U # \d + : .* - ( [ \d \. ] + ) K H \/ s / , 'T-Rex (kh/s)' ] ,
64+ [ 1e6 , 2 , / ^ G P U # \d + : .* - ( [ \d \. ] + ) M H \/ s / , 'T-Rex (mh/s)' ] ,
65+ [ 1e9 , 2 , / ^ G P U # \d + : .* - ( [ \d \. ] + ) G H \/ s / , 'T-Rex (gh/s)' ] ,
66+ [ 1 , 2 , / ^ A v e r a g e s p e e d \( 3 0 s \) : ( [ \d \. ] + ) h \/ s / , 'lolMiner (h/s)' ] ,
67+ [ 1e3 , 2 , / ^ A v e r a g e s p e e d \( 3 0 s \) : ( [ \d \. ] + ) k h \/ s / , 'lolMiner (kh/s)' ] ,
68+ [ 1e6 , 2 , / ^ A v e r a g e s p e e d \( 3 0 s \) : ( [ \d \. ] + ) m h \/ s / , 'lolMiner (mh/s)' ] ,
69+ [ 1e9 , 2 , / ^ A v e r a g e s p e e d \( 3 0 s \) : ( [ \d \. ] + ) g h \/ s / , 'lolMiner (gh/s)' ] ,
70+ [ 1 , 2 , / ^ E t h s p e e d : ( [ \d \. ] + ) H \/ s , s h a r e s : .* t i m e : / , 'PhoenixMiner (h/s)' ] ,
71+ [ 1e3 , 2 , / ^ E t h s p e e d : ( [ \d \. ] + ) K H \/ s , s h a r e s : .* t i m e : / , 'PhoenixMiner (kh/s)' ] ,
72+ [ 1e6 , 2 , / ^ E t h s p e e d : ( [ \d \. ] + ) M H \/ s , s h a r e s : .* t i m e : / , 'PhoenixMiner (mh/s)' ] ,
73+ [ 1e9 , 2 , / ^ E t h s p e e d : ( [ \d \. ] + ) G H \/ s , s h a r e s : .* t i m e : / , 'PhoenixMiner (gh/s)' ] ,
5874] ;
75+ const hashrate_per_gpu = [ ]
5976
6077function algo_hashrate_factor ( algo ) {
6178 switch ( algo ) {
@@ -452,10 +469,10 @@ function start_miner_raw(exe, args, out_cb) {
452469 let proc = child_process . spawn ( exe , args , is_miner_stdin ? { stdio : [ 'inherit' , 'pipe' , 'pipe' ] } : { } ) ;
453470
454471 proc . stdout . on ( 'data' , ( data ) => {
455- if ( out_cb ) out_cb ( ` ${ data } ` ) ;
472+ if ( out_cb ) out_cb ( data . toString ( ) ) ;
456473 } ) ;
457474 proc . stderr . on ( 'data' , ( data ) => {
458- if ( out_cb ) out_cb ( ` ${ data } ` ) ;
475+ if ( out_cb ) out_cb ( data . toString ( ) ) ;
459476 } ) ;
460477 proc . on ( 'close' , ( code ) => {
461478 if ( is_verbose_mode ) {
@@ -841,15 +858,15 @@ function do_miner_perf_runs(cb) {
841858 jsonrpc : "2.0" ,
842859 method : "mining.set_difficulty" ,
843860 params : [
844- 1000000
861+ 10.24
845862 ] ,
846863 } ) + "\n" + JSON . stringify ( {
847864 jsonrpc : "2.0" ,
848865 method : "mining.notify" ,
849866 params : [
850867 "benchmark1" , // job_id
851- "e79f0f63030bf691445c2b9d0266b24a9619e355194067f2ad2c73a8e0a26c65 " , // seed hash
852- "feb4243b885cd1af5337979f5d81849335cab197b4993e5c61ea4b43b43dbbc6 " , // hash
868+ "ffaad0781cfec93fee66657ef8a9f132f422becba3626b5d936ad3cb1f8228d4 " , // seed hash
869+ "a917c993b27e4a15c6ed3611bcaa7e5eee5c9b984053f6c1270032c0c4d6dc83 " , // hash
853870 true ,
854871 ]
855872 } ) + "\n" ) ;
@@ -900,27 +917,47 @@ function do_miner_perf_runs(cb) {
900917 } ;
901918 let nr_prints_needed = - 1 ;
902919 let nr_prints_found = 0 ;
903- miner_proc = start_miner ( cmd , function ( str ) {
904- print_messages ( str ) ;
905- str = str . replace ( / \x1b \[ [ 0 - 9 ; ] * m / g, "" ) ; // remove all colors
906- for ( let i in hashrate_regexes ) {
907- const hashrate_regex = hashrate_regexes [ i ] ;
908- const m = str . match ( hashrate_regex [ 2 ] ) ;
909- if ( m ) {
910- if ( nr_prints_needed < 0 ) nr_prints_needed = hashrate_regex [ 1 ] ;
911- const hashrate = parseFloat ( m [ 1 ] ) * hashrate_regex [ 0 ] * algo_hashrate_factor ( algo ) ;
912- if ( ++ nr_prints_found >= nr_prints_needed ) {
913- const algo_deps = bench_algo_deps ( algo , hashrate ) ;
914- for ( let algo_dep in algo_deps ) {
915- log ( "Setting performance for " + algo_dep + " algo to " + algo_deps [ algo_dep ] ) ;
916- c . algo_perf [ algo_dep ] = algo_deps [ algo_dep ] ;
920+ let chunk_leftover = '' ;
921+ miner_proc = start_miner ( cmd , function ( chunk ) {
922+ chunk = [ chunk_leftover , chunk ] . join ( '' )
923+ const buf_size = chunk . lastIndexOf ( '\n' ) ;
924+ chunk_leftover = chunk . slice ( chunk , buf_size ) ;
925+ const eol = `\x1b[0m\n` ;
926+ let hashrate_prev = 0 ;
927+ let line = 0 ;
928+ processing:
929+ for ( let str of chunk . split ( '\n' ) ) {
930+ print_messages ( `${ line ++ } : ${ str } ${ eol } ` ) ;
931+ str = str . replace ( / \x1b \[ [ 0 - 9 ; ] * m / g, "" ) ; // remove all colors
932+ for ( let i in hashrate_regexes ) {
933+ const hashrate_regex = hashrate_regexes [ i ] ;
934+ const m = str . match ( hashrate_regex [ 2 ] ) ;
935+ if ( m ) {
936+ if ( nr_prints_needed < 0 ) nr_prints_needed = hashrate_regex [ 1 ] ;
937+ const hashrate_raw = parseFloat ( m [ 1 ] ) ;
938+ if ( hashrate_raw > 0 ) {
939+ const hashrate = hashrate_raw * hashrate_regex [ 0 ] * algo_hashrate_factor ( algo ) ;
940+ const variance = hashrate_prev / hashrate ;
941+ const variance_good = ( variance > 0.98 && variance < 1.02 ) ;
942+ if ( variance_good > 0.9 && ++ nr_prints_found >= nr_prints_needed ) {
943+ const algo_deps = bench_algo_deps ( algo , hashrate ) ;
944+ for ( let algo_dep in algo_deps ) {
945+ log ( "Setting performance for " + algo_dep + " algo to " + algo_deps [ algo_dep ] ) ;
946+ c . algo_perf [ algo_dep ] = algo_deps [ algo_dep ] ;
947+ }
948+ miner_proc . on ( 'close' , ( code ) => { clearTimeout ( timeout ) ; resolve ( ) ; } ) ;
949+ tree_kill ( miner_proc . pid ) ;
950+ break processing;
951+ } else {
952+ let msg = "Read" ;
953+ if ( ! variance_good ) {
954+ msg = "Skip" ;
955+ }
956+ log ( msg + " performance for " + algo + " algo of " + hashrate + ", waiting for " +
957+ ( nr_prints_needed - nr_prints_found ) + " more print(s)." ) ;
958+ }
959+ hashrate_prev = hashrate
917960 }
918- miner_proc . on ( 'close' , ( code ) => { clearTimeout ( timeout ) ; resolve ( ) ; } ) ;
919- tree_kill ( miner_proc . pid ) ;
920- break ;
921- } else {
922- log ( "Read performance for " + algo + " algo to " + hashrate + ", waiting for " +
923- ( nr_prints_needed - nr_prints_found ) + " more print(s)." ) ;
924961 }
925962 }
926963 }
0 commit comments