示例#1
0
        static Task <double> RunReference(string[] args)
        {
            //TextWriterTraceListener tr1 = new TextWriterTraceListener(System.Console.Out);
            //Debug.Listeners.Add(tr1);

#if DEBUG
            string workerDir = @"C:\temp\azworker-tmp";
#else
            string workerDir = Path.Combine(Environment.GetEnvironmentVariable(SharedDirEnvVariableName), Environment.GetEnvironmentVariable(JobIdEnvVariableName));
#endif
            string normalFilePath = Path.Combine(workerDir, PerformanceCoefficientFileName);
            string refJsonPath    = Path.Combine(workerDir, "reference.json");
            if (!File.Exists(refJsonPath))
            {
                //no reference experiment
                Trace.WriteLine("Reference.json not found, assuming normal 1.0.");
                File.WriteAllText(normalFilePath, "1.0");
                return(Task.FromResult(1.0));
            }
            var exp = ParseReferenceExperiment(refJsonPath);

            var pathForBenchmarks = Path.Combine(workerDir, "refdata", "data");
            var execPath          = Path.Combine(workerDir, "refdata", exp.Definition.Executable);

            Domain   domain     = ResolveDomain(exp.Definition.DomainName);
            string[] benchmarks = Directory.EnumerateFiles(pathForBenchmarks).Select(fn => Path.Combine(pathForBenchmarks, fn)).ToArray();
            Trace.WriteLine(string.Format("Found {0} benchmarks in folder {1}", benchmarks.Length, pathForBenchmarks));
            BenchmarkResult[] results = new BenchmarkResult[benchmarks.Length];
            for (int i = 0; i < benchmarks.Length; ++i)
            {
                Trace.WriteLine(string.Format("Processing reference file {0}", benchmarks[i]));
                results[i] = LocalExperimentRunner.RunBenchmark(
                    -1,
                    execPath,
                    exp.Definition.Parameters,
                    "ref",
                    benchmarks[i],
                    exp.Repetitions,
                    exp.Definition.BenchmarkTimeout,
                    exp.Definition.MemoryLimitMB,
                    null,
                    null,
                    domain,
                    1.0);
            }

            var totalRuntime = results.Sum(r => r.NormalizedCPUTime);
            if (totalRuntime <= 0.0)
            {
                totalRuntime = 0.1;
            }
            double normal = exp.ReferenceValue / totalRuntime;

            Console.WriteLine("Reference data: " + normal.ToString());
            File.WriteAllText(normalFilePath, normal.ToString());
            return(Task.FromResult(normal));
        }