Repository navigation
Expand file tree
/
Copy pathThreading.min.js
More file actions
1 lines (1 loc) · 4.43 KB
/
Copy pathThreading.min.js
File metadata and controls
1 lines (1 loc) · 4.43 KB
1
Bridge.assembly("Threading",function($asm){"use strict";Bridge.define("Threading.Main",{statics:{fields:{MaxNumber:0,PrintFirst1000Primes:!1,NumberOfThreadsPerTest:null},ctors:{init:function(){this.MaxNumber=1e7;this.PrintFirst1000Primes=!1;this.NumberOfThreadsPerTest=$asm.$.Threading.Main.f1(new(System.Collections.Generic.List$1(System.Int32)));Bridge.ready(this.Start)}},methods:{IsPrime:function(number){var boundary,i;if(number===1)return!1;if(number===2)return!0;for(boundary=Bridge.Int.clip32(Math.floor(Math.sqrt(number))),i=2;i<=boundary;i=i+1|0)if(number%i==0)return!1;return!0},RunPrime:function(param){for(var range=param,primes=new(System.Collections.Generic.List$1(System.Int32)),n=range.First;n<range.Last;n=n+1|0)Threading.Main.IsPrime(n)&&primes.add(n);return primes.toArray()},JoinAll:function(threads,onJoined){System.Linq.Enumerable.from(threads).any($asm.$.Threading.Main.f2)?window.setTimeout(function(){Threading.Main.JoinAll(threads,onJoined)},10):onJoined()},BenchmarkPrimes:function(){var numberOfThreads=Threading.Main.NumberOfThreadsPerTest.getItem(0),i;Threading.Main.NumberOfThreadsPerTest.removeAt(0);System.Console.WriteLine("Starting next benchmark with "+numberOfThreads+" thread(s)...");var startTime=new Date,primeNumbers=new(System.Collections.Generic.List$1(System.Int32)),countPerThread=Bridge.Int.div(Threading.Main.MaxNumber,numberOfThreads)|0,threads=new(System.Collections.Generic.List$1(System.Threading.Thread));for(i=0;i<numberOfThreads;i=i+1|0)(function(){var range={First:(i*countPerThread|0)+1|0,Last:((i*countPerThread|0)+countPerThread|0)+1|0},t=new System.Threading.Thread.$ctor1(System.Array.init([System.Threading.Thread.getCurrentJsFileUri()],System.String));t.start("Threading.Main.RunPrime",range,function(thread,param,result){var resultPrimes=Bridge.as(result,System.Array.type(System.Int32));primeNumbers.addRange(resultPrimes)});threads.add(t)}).call(this);Threading.Main.JoinAll(threads,function(){var endTime=new Date,primeNumberCount,i1,s,j;if(threads.forEach($asm.$.Threading.Main.f3),primeNumberCount=primeNumbers.Count,Threading.Main.PrintFirst1000Primes)for(primeNumbers=primeNumbers.slice(0,1e3),primeNumbers.sort(),i1=0;i1<100;i1=i1+1|0){for(s="",j=0;j<10;j=j+1|0)s=System.String.concat(s,primeNumbers.getItem((i1*10|0)+j|0)+" ");System.Console.WriteLine(s)}System.Console.WriteLine("Max number: "+Threading.Main.MaxNumber+", Threads: "+numberOfThreads+", Time taken: "+System.Double.format(System.DateTime.subdd(endTime,startTime).getTotalMilliseconds(),"G")+"ms, Number of primes: "+primeNumberCount);Threading.Main.NumberOfThreadsPerTest.Count>0?Threading.Main.BenchmarkPrimes():(Threading.Main.RunBenchmarkOnMainThread(),System.Console.WriteLine("Complete."))})},RunBenchmarkOnMainThread:function(){var i,s,j;System.Console.WriteLine("Starting baseline benchmark on main thread...");var startTime=new Date,primeNumbers=System.Linq.Enumerable.from(Bridge.cast(Threading.Main.RunPrime({First:1,Last:10000001}),System.Array.type(System.Int32))).toList(System.Int32),endTime=new Date,primeNumberCount=primeNumbers.Count;if(Threading.Main.PrintFirst1000Primes)for(primeNumbers=primeNumbers.slice(0,1e3),primeNumbers.sort(),i=0;i<100;i=i+1|0){for(s="",j=0;j<10;j=j+1|0)s=System.String.concat(s,primeNumbers.getItem((i*10|0)+j|0)+" ");System.Console.WriteLine(s)}System.Console.WriteLine("Max number: "+Threading.Main.MaxNumber+", Threads: (Main Thread), Time taken: "+System.Double.format(System.DateTime.subdd(endTime,startTime).getTotalMilliseconds(),"G")+"ms, Number of primes: "+primeNumberCount)},Start:function(){var t=new System.Threading.Thread.$ctor1(System.Array.init([System.Threading.Thread.getCurrentJsFileUri()],System.String));t.addOnMessage($asm.$.Threading.Main.f4);t.postMessage("hello from main thread:)");window.setTimeout(Threading.Main.BenchmarkPrimes,500)},MessagePassingThread:function(){System.Threading.Thread.CurrentThread.IsWebWorker&&System.Threading.Thread.CurrentThread.addOnMessage(function(o){console.log("Got message in worker: ",Bridge.unbox(o));System.Threading.Thread.CurrentThread.postMessage("hello from the worker thread :)")})}}},$entryPoint:!0});Bridge.ns("Threading.Main",$asm.$);Bridge.apply($asm.$.Threading.Main,{f1:function(_o1){return _o1.add(1),_o1.add(2),_o1.add(4),_o1.add(6),_o1.add(8),_o1.add(12),_o1.add(16),_o1},f2:function(e){return e.IsAlive},f3:function(e){e.dispose()},f4:function(o){console.log("Got message in main thread: ",Bridge.unbox(o))}});Bridge.init(function(){Threading.Main.MessagePassingThread()})});