|  | @@ -64,15 +64,21 @@ namespace Google.ProtocolBuffers.ProtoBench
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              FastTest = temp.Remove("/fast") || temp.Remove("-fast");
 | 
	
		
			
				|  |  |              Verbose = temp.Remove("/verbose") || temp.Remove("-verbose");
 | 
	
		
			
				|  |  | -            
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              RunBenchmark = BenchmarkV1;
 | 
	
		
			
				|  |  |              if (temp.Remove("/v2") || temp.Remove("-v2"))
 | 
	
		
			
				|  |  | -                RunBenchmark = BenchmarkV2;
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                string cpu = temp.Find(x => x.StartsWith("-cpu:"));
 | 
	
		
			
				|  |  | +                int cpuIx = 1;
 | 
	
		
			
				|  |  | +                if (cpu != null) cpuIx = 1 << Math.Max(0, int.Parse(cpu.Substring(5)));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +                //pin the entire process to a single CPU
 | 
	
		
			
				|  |  | +                Process.GetCurrentProcess().ProcessorAffinity = new IntPtr(cpuIx);
 | 
	
		
			
				|  |  | +                Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime;
 | 
	
		
			
				|  |  | +                RunBenchmark = BenchmarkV2;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |              args = temp.ToArray();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              if (args.Length < 2 || (args.Length%2) != 0)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  Console.Error.WriteLine("Usage: ProtoBench [/fast] <descriptor type name> <input data>");
 | 
	
	
		
			
				|  | @@ -188,13 +194,6 @@ namespace Google.ProtocolBuffers.ProtoBench
 | 
	
		
			
				|  |  |                              
 | 
	
		
			
				|  |  |                              double bps = (iterations * dataSize) / (cycle.TotalSeconds * 1024 * 1024);
 | 
	
		
			
				|  |  |                              if (Verbose) Console.WriteLine("Round {0,3}: Count = {1,6}, Bps = {2,8:f3}", runs, iterations, bps);
 | 
	
		
			
				|  |  | -                            if (runs == 0 && bps > first * 1.1)
 | 
	
		
			
				|  |  | -                            {
 | 
	
		
			
				|  |  | -                                if (Verbose) Console.WriteLine("Warming up...");
 | 
	
		
			
				|  |  | -                                iterations = (int)((target.Ticks * iterations) / (double)cycle.Ticks);
 | 
	
		
			
				|  |  | -                                first = bps;
 | 
	
		
			
				|  |  | -                                continue;//still warming up...
 | 
	
		
			
				|  |  | -                            }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                              best = Math.Max(best, bps);
 | 
	
		
			
				|  |  |                              worst = Math.Min(worst, bps);
 |