singrdk/base/Applications/ServiceManager/Benchmark/CommunicationJob.sg

129 lines
4.4 KiB
Plaintext
Raw Normal View History

2008-03-05 09:52:00 -05:00
///////////////////////////////////////////////////////////////////////////////
//
// Microsoft Research Singularity
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// File: Applications\ServiceManager\Benchmark\CommunicationJob.sg
//
// Note:
//
using System;
using System.Threading;
using System.Text;
using Microsoft.SingSharp;
using Microsoft.Singularity;
using Microsoft.Singularity.Channels;
using Microsoft.Singularity.Io;
using Microsoft.Singularity.Services;
using Microsoft.Singularity.ServiceManager;
namespace Microsoft.Singularity.Applications.ServiceManager
{
internal class CommunicationJob : Job
{
private const int MaxSamples = 100;
private ulong[,] time = new ulong[3, MaxSamples];
private ulong outgoing;
private ulong incoming;
private ulong outTotal;
private ulong inTotal;
internal CommunicationJob(BenchmarkServerInfo! info)
{
base(info);
}
internal override bool Run()
{
bool success = false;
ulong time1, time2, time3;
BenchmarkContract.Imp:Ready! ep;
if (!base.Bind(out ep)) {
success = false;
goto exit;
}
Console.WriteLine("CommunicationJob start");
DebugStub.WriteLine("-- CommunicationJob start");
time[0, 0] = Processor.GetCycleCount();
ep.SendGetCycleCount();
switch receive {
case ep.CycleCount(number):
time[2, 0] = Processor.GetCycleCount();
time[1, 0] = number;
break;
case ep.ChannelClosed():
Console.WriteLine("ChannelClosed @ comm\n");
success = false;
goto exit;
break;
}
for (int i = 1; i < MaxSamples; i++) {
time[0, i] = Processor.GetCycleCount();
ep.SendGetCycleCount();
switch receive {
case ep.CycleCount(number):
time[2, i] = Processor.GetCycleCount();
time[1, i] = number;
break;
case ep.ChannelClosed():
Console.WriteLine("ChannelClosed @ comm\n");
success = false;
goto exit;
break;
}
}
ep.SendEndOfBenchmark();
switch receive {
case ep.AckEnd():
break;
case ep.ChannelClosed():
break;
}
for (int i = 0; i < MaxSamples; i++) {
outTotal += (time[1, i] - time[0, i]);
inTotal += (time[2, i] - time[1, i]);
}
outgoing = outTotal / MaxSamples;
incoming = inTotal / MaxSamples;
success = true;
exit:
delete ep;
return success;
}
public override String! ToString()
{
StringBuilder builder = new StringBuilder();
builder.Append("-- Communication Test Result (");
builder.Append(MaxSamples);
builder.Append(" samples) --\n");
builder.Append("No. Cycle Count Cycle Count Cycle Count\n");
builder.Append("--- ----------- ----------- -----------\n");
for (int i = 0; i < 10; i++) {
builder.AppendFormat("{0, 3} {1, 11} {2, 11} {3, 11}\n",
i, time[0, i], time[1, i], time[2, i]);
}
builder.Append("\n");
builder.Append("Direction TotalCycles Average\n");
builder.Append("--------- ----------- -------\n");
builder.AppendFormat("Outgoing {0, 11} {1, 7}\n",
outTotal, outgoing);
builder.AppendFormat("Incoming {0, 11} {1, 7}\n",
inTotal, incoming);
builder.AppendFormat("Round-trip {0, 11} {1, 7}\n",
outTotal + inTotal, outgoing + incoming);
return builder.ToString();
}
}
}