// $Id$
//
// Copyright 2007-2008 Cisco Systems Inc.
//
// Licensed 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.
using System;
using System.Collections.Generic;
namespace Etch.Util
{
///
/// Framework for running performance tests.
///
public class PerfTest
{
private readonly String _descr;
private readonly int _runtime;
private readonly int _count;
private readonly RunTimes _r;
///
/// Construct the perftest
///
/// description of the test
/// the number of seconds to run each test cycle
/// the number of test cycles to run
public PerfTest( String descr, int runtime, int count, RunTimes rt )
{
_descr = descr;
_runtime = runtime;
_count = count;
_r = rt;
}
///
/// Runs the PerfTest
///
public void Run( )
{
long oldn = 0;
long n = 1;
double t = 0;
while (t < 1)
{
if (t > 0.1)
Console.WriteLine( "{0}: {1} took {2}, trying {3} to get >= 1 second\n", _descr, oldn, t, n );
oldn = n;
t = RunOne( n );
n *= 2;
}
n = oldn;
int k = 2;
n = (long) (k * n / t);
Console.WriteLine( "{0}: {1} took {2}, trying {3} for {4} seconds\n", _descr, oldn, t, n, k );
oldn = n;
t = RunOne( n );
k = 4;
n = (long) (k * n / t);
Console.WriteLine( "{0}: {1} took {2}, trying {3} for {4} seconds\n", _descr, oldn, t, n, k );
oldn = n;
t = RunOne( n );
n = (long) (_runtime * n / t);
Console.WriteLine( "{0}: {1} took {2}, using {3} for {4} seconds\n",
_descr, oldn, t, n, _runtime );
List list = new List( _count );
double sum = 0;
for (int i = 1; i <= _count; i++)
{
t = RunOne( n );
double r = n/t;
list.Add( r );
sum += r;
Console.WriteLine( "{0} {1}/{2}\t{3}\t{4}\t{5}\n",
_descr, i, _count, n, t, r );
}
list.Sort();
Console.WriteLine( "{0} min\t{1}\n", _descr, list[ 0 ] );
Console.WriteLine( "{0} median\t{1}\n", _descr, list[ _count/2 ] );
Console.WriteLine( "{0} avg\t{1}\n", _descr, sum/_count );
Console.WriteLine( "{0} max\t{1}\n", _descr, list[ _count-1 ] );
}
private double RunOne( long n )
{
long t0 = Etch.Util.HPTimer.Now();
_r( n );
return Etch.Util.HPTimer.SecondsSince(t0);
}
///
/// Runs the test with the specific number of times.
///
///
public delegate void RunTimes( long n );
}
}