blob: 3fb7a8f27697f5221f7140dd3218806ee67e6b78 [file] [log] [blame]
using Lucene.Net.Benchmarks.ByTask.Utils;
using Lucene.Net.Util;
using System;
using System.IO;
using System.Text;
using Console = Lucene.Net.Util.SystemConsole;
namespace Lucene.Net.Benchmarks.ByTask
{
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/// <summary>
/// Run the benchmark algorithm.
/// </summary>
/// <remarks>
/// <list type="number">
/// <item><description>Read algorithm.</description></item>
/// <item><description>Run the algorithm.</description></item>
/// </list>
/// <para/>
/// Things to be added/fixed in "Benchmarking by tasks":
/// <list type="number">
/// <item><description>TODO - report into Excel and/or graphed view.</description></item>
/// <item><description>TODO - perf comparison between Lucene releases over the years.</description></item>
/// <item><description>TODO - perf report adequate to include in Lucene nightly build site? (so we can easily track performance changes.)</description></item>
/// <item><description>TODO - add overall time control for repeated execution (vs. current by-count only).</description></item>
/// <item><description>TODO - query maker that is based on index statistics.</description></item>
/// </list>
/// </remarks>
public class Benchmark
{
private readonly PerfRunData runData; // LUCENENET: marked readonly
private readonly Algorithm algorithm; // LUCENENET: marked readonly
private bool executed;
public Benchmark(TextReader algReader)
{
// prepare run data
try
{
runData = new PerfRunData(new Config(algReader));
}
catch (Exception e)
{
//e.printStackTrace();
throw new Exception("Error: cannot init PerfRunData!", e);
}
// parse algorithm
try
{
algorithm = new Algorithm(runData);
}
catch (Exception e)
{
throw new Exception("Error: cannot understand algorithm!", e);
}
}
/// <summary>
/// Execute this benchmark.
/// </summary>
public virtual void Execute()
{
lock (this)
{
if (executed)
{
throw new InvalidOperationException("Benchmark was already executed");
}
executed = true;
runData.SetStartTimeMillis();
algorithm.Execute();
}
}
/// <summary>
/// Run the benchmark algorithm.
/// </summary>
/// <param name="args">Benchmark config and algorithm files.</param>
public static void Main(string[] args)
{
Exec(args);
}
/// <summary>
/// Utility: execute benchmark from command line.
/// </summary>
/// <param name="args">Single argument is expected: algorithm-file.</param>
public static void Exec(string[] args)
{
// verify command line args
if (args.Length < 1)
{
// LUCENENET specific - usage info printed by our wrapper console
throw new ArgumentException();
//Console.WriteLine("Usage: java Benchmark <algorithm file>");
//Environment.Exit(1);
}
// verify input files
FileInfo algFile = new FileInfo(args[0]);
if (!algFile.Exists /*|| !algFile.isFile() ||!algFile.canRead()*/ )
{
Console.WriteLine("cannot find/read algorithm file: " + algFile.FullName);
Environment.Exit(1);
}
Console.WriteLine("Running algorithm from: " + algFile.FullName);
Benchmark benchmark = null;
try
{
benchmark = new Benchmark(IOUtils.GetDecodingReader(algFile, Encoding.UTF8));
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
Environment.Exit(1);
}
Console.WriteLine("------------> algorithm:");
Console.WriteLine(benchmark.Algorithm.ToString());
// execute
try
{
benchmark.Execute();
}
catch (Exception e)
{
Console.WriteLine("Error: cannot execute the algorithm! " + e.Message);
Console.WriteLine(e.StackTrace);
}
Console.WriteLine("####################");
Console.WriteLine("### D O N E !!! ###");
Console.WriteLine("####################");
}
/// <summary>
/// Returns the algorithm.
/// </summary>
public virtual Algorithm Algorithm => algorithm;
/// <summary>
/// Returns the runData.
/// </summary>
public virtual PerfRunData RunData => runData;
}
}