mirror of
https://github.com/anticensority/runet-censorship-bypass.git
synced 2024-11-30 21:33:43 +03:00
122 lines
3.2 KiB
C#
122 lines
3.2 KiB
C#
using System;
|
|
using System.IO;
|
|
|
|
using PacProxyUsage;
|
|
using System.Runtime.InteropServices;
|
|
|
|
using System.Text.RegularExpressions;
|
|
|
|
public class Program
|
|
{
|
|
|
|
public static string RunTest(string hostsFile, string pacName, bool ifMissing = false) {
|
|
using(StreamReader hostsReader = new StreamReader(hostsFile))
|
|
{
|
|
|
|
string pacUri = "http://localhost:8080/"+pacName+"?"+new Random().Next();
|
|
Console.WriteLine(pacUri);
|
|
GC.Collect();
|
|
long memBefore = GC.GetTotalMemory(true);
|
|
|
|
var myTimer = new QueryPerfCounter();
|
|
myTimer.Start();
|
|
|
|
int iterations = 0;
|
|
string host;
|
|
while( (host = hostsReader.ReadLine()) != null )
|
|
{
|
|
string uri = Proxy.GetProxyForUrlUsingPac( "http://"+host, pacUri );
|
|
if (ifMissing && uri != null || !ifMissing && uri == null)
|
|
Console.WriteLine("DIRECT !" + host + "!");
|
|
//else Console.WriteLine("PROXY !" + uri + "!"); // For DEBUG.
|
|
++iterations;
|
|
}
|
|
|
|
myTimer.Stop();
|
|
// Calculate time per iteration in nanoseconds
|
|
double duration = myTimer.Duration(iterations);
|
|
|
|
long memAfter = GC.GetTotalMemory(false);
|
|
long memUsage = memAfter - memBefore;
|
|
double memPerAddr = memUsage / (double) iterations;
|
|
|
|
var resultNs = Convert.ToInt32(duration).ToString();
|
|
var resultBytes = Convert.ToInt32(memPerAddr).ToString();
|
|
return string.Format( "{0} bytes, {1} ns", resultBytes, resultNs );
|
|
}
|
|
}
|
|
|
|
public static void Main(string[] args)
|
|
{
|
|
if (args.Length != 1 || !Directory.Exists(args[0]))
|
|
{
|
|
Console.WriteLine("Arguments: PACs-dir.\nPac scripts must be served from the root of localhost:8080.");
|
|
return;
|
|
}
|
|
|
|
bool ifAppend = true;
|
|
using (StreamWriter resultsWriter = new StreamWriter("Output.txt", ifAppend))
|
|
{
|
|
resultsWriter.WriteLine("======================");
|
|
|
|
var pacsPath = args[0];
|
|
string [] pacs = Directory.GetFiles(pacsPath);
|
|
|
|
foreach(string pacPath in pacs)
|
|
{
|
|
string pacName = Path.GetFileName(pacPath);
|
|
|
|
Regex r = new Regex(@"^(\w+-\w+)", RegexOptions.IgnoreCase);
|
|
Match m = r.Match(pacName);
|
|
var prefix = m.Groups[1].ToString();
|
|
var hostsFile = "./Inputs/"+prefix + ".txt";
|
|
var missedFile = "./Inputs/missed.txt";
|
|
|
|
var results = pacName+": "+RunTest(hostsFile, pacName) + ", Missed: "+RunTest(missedFile, pacName, true);
|
|
Console.WriteLine(results);
|
|
resultsWriter.WriteLine(results);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
public class QueryPerfCounter
|
|
{
|
|
[DllImport("KERNEL32")]
|
|
private static extern bool QueryPerformanceCounter(
|
|
out long lpPerformanceCount);
|
|
|
|
[DllImport("Kernel32.dll")]
|
|
private static extern bool QueryPerformanceFrequency(out long lpFrequency);
|
|
|
|
private long start;
|
|
private long stop;
|
|
private long frequency;
|
|
Decimal multiplier = new Decimal(1.0e9);
|
|
|
|
public QueryPerfCounter()
|
|
{
|
|
if (QueryPerformanceFrequency(out frequency) == false)
|
|
{
|
|
// Frequency not supported
|
|
throw new Exception();
|
|
}
|
|
}
|
|
|
|
public void Start()
|
|
{
|
|
QueryPerformanceCounter(out start);
|
|
}
|
|
|
|
public void Stop()
|
|
{
|
|
QueryPerformanceCounter(out stop);
|
|
}
|
|
|
|
public double Duration(int iterations)
|
|
{
|
|
return ((((double)(stop - start)* (double) multiplier) / (double) frequency)/iterations);
|
|
}
|
|
}
|