mirror of
				https://github.com/anticensority/runet-censorship-bypass.git
				synced 2025-11-04 01:47:54 +03:00 
			
		
		
		
	Remove obsolete perf analyses
This commit is contained in:
		
							parent
							
								
									d5aa1bab71
								
							
						
					
					
						commit
						f74397b75d
					
				| 
						 | 
					@ -1,26 +0,0 @@
 | 
				
			||||||
## PAC-Script Performance Analysis
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Somewhere in PAC-script you may want:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
```javascript
 | 
					 | 
				
			||||||
if (Is_subdomain_of( host, blocked_hosts ))
 | 
					 | 
				
			||||||
  return 'use proxy';
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
You have to make `Is_subdomain_of` very fast.  
 | 
					 | 
				
			||||||
This check is executed on each request. You should watch memeory consumption too.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
The naive solution is to keep array of blocked ips and check if the host resolves to one of the ips.  
 | 
					 | 
				
			||||||
You may do it with `indexOf`, binary search, etc.  
 | 
					 | 
				
			||||||
The shortcoming of every ip solution is that __some providers resolve blocked hosts to wrong ips__, so we eventually need list of hosts.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
I have tested different [solutions](https://github.com/ilyaigpetrov/anti-censorship-russia/tree/master/pac-generator/src), and depicted [results](./benchmark/Output.txt) in the following chart:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||

 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
* __IPs indexOf__ – Blocked IP is searched by `indexOf`
 | 
					 | 
				
			||||||
* __IPs binary__  – Blocked IP is searched by binary search. For some reason hit time is slightly increased.
 | 
					 | 
				
			||||||
* __IPs switch__  – Simply `switch(Blocked_IP) { case1: ... caseN: return true }`. Works even better than binary search. Magic.
 | 
					 | 
				
			||||||
* __Hosts switch__ – Radix trie built on `switch`. Comparable to __IPs switch__.
 | 
					 | 
				
			||||||
* __Hosts reversed binary__ – binary search on hosts, but hosts are kept in reversed form: _"gro.evichra"_ instead of _"archive.org"_. It shouldn't really affect anything, but it does, maybe because I also use `dnsDomainIs` instead of `===`.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1 +0,0 @@
 | 
				
			||||||
bin
 | 
					 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -1,89 +0,0 @@
 | 
				
			||||||
blocked-hosts-reversed-binary.js:     371 bytes, 3633268 ns, Missed: 331 bytes, 959025  ns
 | 
					 | 
				
			||||||
blocked-hosts-switch.js:              35  bytes, 861416  ns, Missed: 54  bytes, 1009980 ns
 | 
					 | 
				
			||||||
blocked-hosts-binary.js:              355 bytes, 3741660 ns, Missed: 315 bytes, 1101475 ns
 | 
					 | 
				
			||||||
blocked-hosts-plain-switch.js:        368 bytes, 4595046 ns, Missed: 327 bytes, 1181185 ns
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
blocked-ips-indexOf.js:               30  bytes, 4744851 ns, Missed: 50  bytes, 949647  ns
 | 
					 | 
				
			||||||
blocked-ips-switch.js:                30  bytes, 1324520 ns, Missed: 50  bytes, 954300  ns
 | 
					 | 
				
			||||||
blocked-ips-binary.js:                30  bytes, 3528872 ns, Missed: 50  bytes, 955016  ns
 | 
					 | 
				
			||||||
======================
 | 
					 | 
				
			||||||
blocked-hosts-reversed-binary.js:     60  bytes, 3810837 ns, Missed: 71  bytes, 971006  ns
 | 
					 | 
				
			||||||
blocked-hosts-switch.js:              90  bytes, 881944  ns, Missed: 54  bytes, 987749  ns
 | 
					 | 
				
			||||||
blocked-hosts-binary.js:              352 bytes, 3715816 ns, Missed: 311 bytes, 1015559 ns
 | 
					 | 
				
			||||||
blocked-hosts-plain-switch.js:        367 bytes, 5108743 ns, Missed: 322 bytes, 1057506 ns
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
blocked-ips-switch.js:                32  bytes, 1331517 ns, Missed: 48  bytes, 952596  ns
 | 
					 | 
				
			||||||
blocked-ips-indexOf.js:               36  bytes, 4863773 ns, Missed: 50  bytes, 956231  ns
 | 
					 | 
				
			||||||
blocked-ips-binary.js:                33  bytes, 3724425 ns, Missed: 52  bytes, 958463  ns
 | 
					 | 
				
			||||||
======================
 | 
					 | 
				
			||||||
blocked-hosts-plain-switch.js:        367 bytes, 3895654 ns, Missed: 218 bytes, 590817 ns
 | 
					 | 
				
			||||||
blocked-hosts-binary.js:              351 bytes, 4559283 ns, Missed: 207 bytes, 595531 ns
 | 
					 | 
				
			||||||
blocked-hosts-reversed-binary.js:     367 bytes, 3757800 ns, Missed: 96  bytes, 607930 ns
 | 
					 | 
				
			||||||
blocked-hosts-switch.js:              85  bytes, 909670  ns, Missed: 82  bytes, 665152 ns
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
blocked-ips-switch.js:                34  bytes, 1326365 ns, Missed: 72  bytes, 583463 ns
 | 
					 | 
				
			||||||
blocked-ips-binary.js:                36  bytes, 3567749 ns, Missed: 77  bytes, 583504 ns
 | 
					 | 
				
			||||||
blocked-ips-indexOf.js:               37  bytes, 4794414 ns, Missed: 77  bytes, 584845 ns
 | 
					 | 
				
			||||||
======================
 | 
					 | 
				
			||||||
blocked-hosts-binary.js:              355 bytes, 3669894 ns, Missed: 207 bytes, 593995 ns
 | 
					 | 
				
			||||||
blocked-hosts-plain-switch.js:        363 bytes, 3977687 ns, Missed: 223 bytes, 594579 ns
 | 
					 | 
				
			||||||
blocked-hosts-switch.js:              89  bytes, 874404  ns, Missed: 81  bytes, 608442 ns
 | 
					 | 
				
			||||||
blocked-hosts-reversed-binary.js:     54  bytes, 3706841 ns, Missed: 96  bytes, 622309 ns
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
blocked-ips-indexOf.js:               35  bytes, 4839284 ns, Missed: 78  bytes, 587725 ns
 | 
					 | 
				
			||||||
blocked-ips-switch.js:                43  bytes, 1346437 ns, Missed: 77  bytes, 599972 ns
 | 
					 | 
				
			||||||
blocked-ips-binary.js:                33  bytes, 3651593 ns, Missed: 80  bytes, 621814 ns
 | 
					 | 
				
			||||||
======================
 | 
					 | 
				
			||||||
blocked-hosts-binary.js:              352 bytes, 3711255 ns, Missed: 207 bytes, 590903 ns
 | 
					 | 
				
			||||||
blocked-hosts-switch.js:              91  bytes, 863216  ns, Missed: 77  bytes, 592086 ns
 | 
					 | 
				
			||||||
blocked-hosts-reversed-binary.js:     371 bytes, 3690426 ns, Missed: 99  bytes, 595659 ns
 | 
					 | 
				
			||||||
blocked-hosts-plain-switch.js:        367 bytes, 3933146 ns, Missed: 218 bytes, 618715 ns
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
blocked-ips-indexOf.js:               34  bytes, 4861233 ns, Missed: 77  bytes, 592716 ns
 | 
					 | 
				
			||||||
blocked-ips-switch.js:                30  bytes, 1339607 ns, Missed: 84  bytes, 595159 ns
 | 
					 | 
				
			||||||
blocked-ips-binary.js:                31  bytes, 3552007 ns, Missed: 76  bytes, 603872 ns
 | 
					 | 
				
			||||||
======================
 | 
					 | 
				
			||||||
blocked-hosts-binary-trie.js:         364 bytes, 27134555ns, Missed: 218 bytes, 725467 ns
 | 
					 | 
				
			||||||
blocked-hosts-simple-trie.js:         364 bytes, 4085395 ns, Missed: 219 bytes, 649011 ns
 | 
					 | 
				
			||||||
======================
 | 
					 | 
				
			||||||
blocked-hosts-plain-switch.js:        69  bytes, 2850095 ns, Missed: 96  bytes, 590933 ns
 | 
					 | 
				
			||||||
blocked-hosts-switch.js:              93  bytes, 854636  ns, Missed: 77  bytes, 597410 ns
 | 
					 | 
				
			||||||
blocked-hosts-reversed-binary.js:     109 bytes, 3710108 ns, Missed: 96  bytes, 604745 ns
 | 
					 | 
				
			||||||
blocked-hosts-hash.js:                351 bytes, 5112411 ns, Missed: 203 bytes, 605303 ns
 | 
					 | 
				
			||||||
blocked-hosts-binary.js:              355 bytes, 3691874 ns, Missed: 207 bytes, 615506 ns
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
blocked-ips-binary.js:                33 bytes, 3558958  ns, Missed: 81  bytes, 607783 ns
 | 
					 | 
				
			||||||
blocked-ips-indexOf.js:               35 bytes, 4832252  ns, Missed: 77  bytes, 593958 ns
 | 
					 | 
				
			||||||
blocked-ips-switch.js:                36 bytes, 1341637  ns, Missed: 76  bytes, 613332 ns
 | 
					 | 
				
			||||||
======================
 | 
					 | 
				
			||||||
blocked-hosts-binary.js:              356 bytes, 3763269 ns, Missed: 211 bytes, 595469 ns
 | 
					 | 
				
			||||||
blocked-hosts-plain-switch.js:        364 bytes, 2865722 ns, Missed: 223 bytes, 597233 ns
 | 
					 | 
				
			||||||
blocked-hosts-reversed-binary.js:     106 bytes, 3680757 ns, Missed: 96  bytes, 604607 ns
 | 
					 | 
				
			||||||
blocked-hosts-switch.js:              93 bytes,  865423  ns, Missed: 81  bytes, 606328 ns
 | 
					 | 
				
			||||||
blocked-hosts-hash.js:                347 bytes, 5163575 ns, Missed: 207 bytes, 607421 ns
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
blocked-ips-indexOf.js:               33 bytes,  4845498 ns, Missed: 77  bytes, 594833 ns
 | 
					 | 
				
			||||||
blocked-ips-switch.js:                35 bytes,  1345531 ns, Missed: 77  bytes, 601800 ns
 | 
					 | 
				
			||||||
blocked-ips-binary.js:                38 bytes,  3575806 ns, Missed: 80  bytes, 608611 ns
 | 
					 | 
				
			||||||
======================
 | 
					 | 
				
			||||||
blocked-hosts-reversed-binary.js:     109 bytes, 3704594 ns, Missed: 96  bytes, 602820 ns
 | 
					 | 
				
			||||||
blocked-hosts-binary.js:              351 bytes, 3718253 ns, Missed: 210 bytes, 605188 ns
 | 
					 | 
				
			||||||
blocked-hosts-plain-switch.js:        367 bytes, 2874843 ns, Missed: 88  bytes, 607200 ns
 | 
					 | 
				
			||||||
blocked-hosts-hash.js:                347 bytes, 5062512 ns, Missed: 207 bytes, 609278 ns
 | 
					 | 
				
			||||||
blocked-hosts-switch.js:              88  bytes, 894410  ns, Missed: 77  bytes, 614169 ns
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
blocked-ips-switch.js:                37  bytes, 1348111 ns, Missed: 72  bytes, 597439 ns
 | 
					 | 
				
			||||||
blocked-ips-indexOf.js:               35  bytes, 4853437 ns, Missed: 72  bytes, 599850 ns
 | 
					 | 
				
			||||||
blocked-ips-binary.js:                31  bytes, 3542401 ns, Missed: 77  bytes, 602958 ns
 | 
					 | 
				
			||||||
======================
 | 
					 | 
				
			||||||
blocked-hosts-binary.js:              351 bytes, 3729603 ns, Missed: 211 bytes, 608708 ns
 | 
					 | 
				
			||||||
blocked-hosts-hash.js:                347 bytes, 5009832 ns, Missed: 207 bytes, 610767 ns
 | 
					 | 
				
			||||||
blocked-hosts-plain-switch.js:         33 bytes, 2979803 ns, Missed:  94 bytes, 617564 ns
 | 
					 | 
				
			||||||
blocked-hosts-reversed-binary.js:     108 bytes, 3771339 ns, Missed:  96 bytes, 600923 ns
 | 
					 | 
				
			||||||
blocked-hosts-switch.js:               88 bytes,  886985 ns, Missed:  81 bytes, 611207 ns
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
blocked-ips-binary.js:                 33 bytes, 3518561 ns, Missed:  77 bytes, 614293 ns
 | 
					 | 
				
			||||||
blocked-ips-indexOf.js:                36 bytes, 4876239 ns, Missed:  80 bytes, 608928 ns
 | 
					 | 
				
			||||||
blocked-ips-switch-trie-index.js:      55 bytes,  831119 ns, Missed:  97 bytes, 606306 ns
 | 
					 | 
				
			||||||
blocked-ips-switch-trie.js:            43 bytes,  836457 ns, Missed:  86 bytes, 641512 ns
 | 
					 | 
				
			||||||
blocked-ips-switch.js:                 31 bytes, 1401377 ns, Missed:  72 bytes, 637717 ns
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,121 +0,0 @@
 | 
				
			||||||
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);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,46 +0,0 @@
 | 
				
			||||||
using System;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace PacProxyUsage
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	/// <summary>
 | 
					 | 
				
			||||||
	/// Summary description for Proxy.
 | 
					 | 
				
			||||||
	/// </summary>
 | 
					 | 
				
			||||||
	public class Proxy
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		public Proxy()
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        /// <summary>
 | 
					 | 
				
			||||||
        /// Return proxy for requested Url
 | 
					 | 
				
			||||||
        /// </summary>
 | 
					 | 
				
			||||||
        /// <param name="sUrl">url</param>
 | 
					 | 
				
			||||||
        /// <param name="sPacUri">Uri to PAC file</param>
 | 
					 | 
				
			||||||
        /// <returns>proxy info</returns>
 | 
					 | 
				
			||||||
        public static string GetProxyForUrlUsingPac ( string DestinationUrl, string PacUri ){
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            IntPtr WinHttpSession = Win32Api.WinHttpOpen("User", Win32Api.WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, IntPtr.Zero, IntPtr.Zero, 0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            Win32Api.WINHTTP_AUTOPROXY_OPTIONS  ProxyOptions   = new Win32Api.WINHTTP_AUTOPROXY_OPTIONS();
 | 
					 | 
				
			||||||
            Win32Api.WINHTTP_PROXY_INFO         ProxyInfo      = new Win32Api.WINHTTP_PROXY_INFO(); 
 | 
					 | 
				
			||||||
            
 | 
					 | 
				
			||||||
			ProxyOptions.fAutoLoginIfChallenged = true;
 | 
					 | 
				
			||||||
            ProxyOptions.dwFlags           = Win32Api.WINHTTP_AUTOPROXY_CONFIG_URL;
 | 
					 | 
				
			||||||
            ProxyOptions.dwAutoDetectFlags = (Win32Api.WINHTTP_AUTO_DETECT_TYPE_DHCP | Win32Api.WINHTTP_AUTO_DETECT_TYPE_DNS_A);
 | 
					 | 
				
			||||||
            ProxyOptions.lpszAutoConfigUrl = PacUri;
 | 
					 | 
				
			||||||
            
 | 
					 | 
				
			||||||
            // Get Proxy 
 | 
					 | 
				
			||||||
            bool IsSuccess = Win32Api.WinHttpGetProxyForUrl( WinHttpSession, DestinationUrl, ref ProxyOptions, ref ProxyInfo );
 | 
					 | 
				
			||||||
            
 | 
					 | 
				
			||||||
            Win32Api.WinHttpCloseHandle(WinHttpSession);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if ( IsSuccess ){
 | 
					 | 
				
			||||||
                return ProxyInfo.lpszProxy;
 | 
					 | 
				
			||||||
            }else {
 | 
					 | 
				
			||||||
                Console.WriteLine("Error: {0}", Win32Api.GetLastError() );
 | 
					 | 
				
			||||||
                return null;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
       
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,204 +0,0 @@
 | 
				
			||||||
using System;
 | 
					 | 
				
			||||||
using System.Runtime.InteropServices;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace PacProxyUsage
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	/// <summary>
 | 
					 | 
				
			||||||
	/// Summary description for Win32Api.
 | 
					 | 
				
			||||||
	/// </summary>
 | 
					 | 
				
			||||||
	public class Win32Api
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
        #region AutoProxy Constants 
 | 
					 | 
				
			||||||
        /// <summary>
 | 
					 | 
				
			||||||
        /// Applies only when setting proxy information
 | 
					 | 
				
			||||||
        /// </summary>
 | 
					 | 
				
			||||||
        public const int WINHTTP_ACCESS_TYPE_DEFAULT_PROXY = 0;
 | 
					 | 
				
			||||||
        /// <summary>
 | 
					 | 
				
			||||||
        /// Internet accessed through a direct connection 
 | 
					 | 
				
			||||||
        /// </summary>
 | 
					 | 
				
			||||||
        public const int WINHTTP_ACCESS_TYPE_NO_PROXY = 1;
 | 
					 | 
				
			||||||
        /// <summary>
 | 
					 | 
				
			||||||
        /// Internet accessed using a proxy
 | 
					 | 
				
			||||||
        /// </summary>
 | 
					 | 
				
			||||||
        public const int WINHTTP_ACCESS_TYPE_NAMED_PROXY = 3;        
 | 
					 | 
				
			||||||
        /// <summary>
 | 
					 | 
				
			||||||
        /// Attempt to automatically discover the URL of the 
 | 
					 | 
				
			||||||
        /// PAC file using both DHCP and DNS queries to the local network.
 | 
					 | 
				
			||||||
        /// </summary>
 | 
					 | 
				
			||||||
        public const int WINHTTP_AUTOPROXY_AUTO_DETECT = 0x00000001;
 | 
					 | 
				
			||||||
        /// <summary>
 | 
					 | 
				
			||||||
        /// Download the PAC file from the URL in the WINHTTP_AUTOPROXY_OPTIONS structure.
 | 
					 | 
				
			||||||
        /// </summary>
 | 
					 | 
				
			||||||
        public const int WINHTTP_AUTOPROXY_CONFIG_URL = 0x00000002;
 | 
					 | 
				
			||||||
        /// <summary>
 | 
					 | 
				
			||||||
        /// Executes the Web Proxy Auto-Discovery (WPAD) protocol in-process instead of 
 | 
					 | 
				
			||||||
        /// delegating to an out-of-process WinHTTP AutoProxy Service, if available. 
 | 
					 | 
				
			||||||
        /// This flag must be combined with one of the other flags
 | 
					 | 
				
			||||||
        /// </summary>
 | 
					 | 
				
			||||||
        public const int WINHTTP_AUTOPROXY_RUN_INPROCESS = 0x00010000;
 | 
					 | 
				
			||||||
        /// <summary>
 | 
					 | 
				
			||||||
        /// By default, WinHTTP is configured to fall back to auto-discover a proxy 
 | 
					 | 
				
			||||||
        /// in-process. If this fallback behavior is undesirable in the event that 
 | 
					 | 
				
			||||||
        /// an out-of-process discovery fails, it can be disabled using this flag.
 | 
					 | 
				
			||||||
        /// </summary>
 | 
					 | 
				
			||||||
        public const int WINHTTP_AUTOPROXY_RUN_OUTPROCESS_ONLY = 0x00020000;
 | 
					 | 
				
			||||||
        /// <summary>
 | 
					 | 
				
			||||||
        /// Use DHCP to locate the proxy auto-configuration file.
 | 
					 | 
				
			||||||
        /// </summary>
 | 
					 | 
				
			||||||
        public const int WINHTTP_AUTO_DETECT_TYPE_DHCP = 0x00000001;
 | 
					 | 
				
			||||||
        /// <summary>
 | 
					 | 
				
			||||||
        /// Use DNS to attempt to locate the proxy auto-configuration file at a 
 | 
					 | 
				
			||||||
        /// well-known location on the domain of the local computer
 | 
					 | 
				
			||||||
        /// </summary>
 | 
					 | 
				
			||||||
        public const int WINHTTP_AUTO_DETECT_TYPE_DNS_A = 0x00000002;
 | 
					 | 
				
			||||||
        #endregion
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        #region Proxy Structures 
 | 
					 | 
				
			||||||
        /// <summary>
 | 
					 | 
				
			||||||
        /// The structure is used to indicate to the WinHttpGetProxyForURL 
 | 
					 | 
				
			||||||
        /// function whether to specify the URL of the Proxy Auto-Configuration 
 | 
					 | 
				
			||||||
        /// (PAC) file or to automatically locate the URL with DHCP or DNS 
 | 
					 | 
				
			||||||
        /// queries to the network
 | 
					 | 
				
			||||||
        /// </summary>
 | 
					 | 
				
			||||||
        [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
 | 
					 | 
				
			||||||
            public struct WINHTTP_AUTOPROXY_OPTIONS {
 | 
					 | 
				
			||||||
            /// <summary>
 | 
					 | 
				
			||||||
            /// Mechanisms should be used to obtain the PAC file
 | 
					 | 
				
			||||||
            /// </summary>
 | 
					 | 
				
			||||||
            [MarshalAs(UnmanagedType.U4)]
 | 
					 | 
				
			||||||
            public int dwFlags;
 | 
					 | 
				
			||||||
            /// <summary>
 | 
					 | 
				
			||||||
            /// If dwflags includes the WINHTTP_AUTOPROXY_AUTO_DETECT flag, 
 | 
					 | 
				
			||||||
            /// then dwAutoDetectFlags specifies what protocols are to be 
 | 
					 | 
				
			||||||
            /// used to locate the PAC file. If both the DHCP and DNS auto 
 | 
					 | 
				
			||||||
            /// detect flags are specified, then DHCP is used first;
 | 
					 | 
				
			||||||
            /// if no PAC URL is discovered using DHCP, then DNS is used.
 | 
					 | 
				
			||||||
            /// If dwflags does not include the WINHTTP_AUTOPROXY_AUTO_DETECT 
 | 
					 | 
				
			||||||
            /// flag, then dwAutoDetectFlags must be zero.
 | 
					 | 
				
			||||||
            /// </summary>
 | 
					 | 
				
			||||||
            [MarshalAs(UnmanagedType.U4)]
 | 
					 | 
				
			||||||
            public int dwAutoDetectFlags;
 | 
					 | 
				
			||||||
            /// <summary>
 | 
					 | 
				
			||||||
            /// If dwflags includes the WINHTTP_AUTOPROXY_CONFIG_URL flag, the 
 | 
					 | 
				
			||||||
            /// lpszAutoConfigUrl must point to a null-terminated Unicode string 
 | 
					 | 
				
			||||||
            /// that contains the URL of the proxy auto-configuration (PAC) file.
 | 
					 | 
				
			||||||
            /// If dwflags does not include the WINHTTP_AUTOPROXY_CONFIG_URL flag, 
 | 
					 | 
				
			||||||
            /// then lpszAutoConfigUrl must be NULL.
 | 
					 | 
				
			||||||
            /// </summary>
 | 
					 | 
				
			||||||
            public string lpszAutoConfigUrl;
 | 
					 | 
				
			||||||
            /// <summary>
 | 
					 | 
				
			||||||
            /// Reserved for future use; must be NULL.
 | 
					 | 
				
			||||||
            /// </summary>
 | 
					 | 
				
			||||||
            public IntPtr lpvReserved;
 | 
					 | 
				
			||||||
            /// <summary>
 | 
					 | 
				
			||||||
            /// Reserved for future use; must be zero.
 | 
					 | 
				
			||||||
            /// </summary>
 | 
					 | 
				
			||||||
            [MarshalAs(UnmanagedType.U4)]
 | 
					 | 
				
			||||||
            public int dwReserved;
 | 
					 | 
				
			||||||
            /// <summary>
 | 
					 | 
				
			||||||
            /// Specifies whether the client's domain credentials should be automatically 
 | 
					 | 
				
			||||||
            /// sent in response to an NTLM or Negotiate Authentication challenge when 
 | 
					 | 
				
			||||||
            /// WinHTTP requests the PAC file.
 | 
					 | 
				
			||||||
            /// If this flag is TRUE, credentials should automatically be sent in response 
 | 
					 | 
				
			||||||
            /// to an authentication challenge. If this flag is FALSE and authentication 
 | 
					 | 
				
			||||||
            /// is required to download the PAC file, the WinHttpGetProxyForUrl fails.
 | 
					 | 
				
			||||||
            /// </summary>
 | 
					 | 
				
			||||||
			[MarshalAs(UnmanagedType.Bool)]
 | 
					 | 
				
			||||||
            public bool fAutoLoginIfChallenged;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
        /// <summary>
 | 
					 | 
				
			||||||
        /// The structure contains the session or default proxy configuration.
 | 
					 | 
				
			||||||
        /// </summary>
 | 
					 | 
				
			||||||
        [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
 | 
					 | 
				
			||||||
            public struct WINHTTP_PROXY_INFO {
 | 
					 | 
				
			||||||
            /// <summary>
 | 
					 | 
				
			||||||
            /// Unsigned long integer value that contains the access type
 | 
					 | 
				
			||||||
            /// </summary>   
 | 
					 | 
				
			||||||
            [MarshalAs(UnmanagedType.U4)]
 | 
					 | 
				
			||||||
            public int dwAccessType;
 | 
					 | 
				
			||||||
            /// <summary>
 | 
					 | 
				
			||||||
            /// Pointer to a string value that contains the proxy server list
 | 
					 | 
				
			||||||
            /// </summary>
 | 
					 | 
				
			||||||
            public string lpszProxy;
 | 
					 | 
				
			||||||
            /// <summary>
 | 
					 | 
				
			||||||
            /// Pointer to a string value that contains the proxy bypass list
 | 
					 | 
				
			||||||
            /// </summary>
 | 
					 | 
				
			||||||
            public string lpszProxyBypass;
 | 
					 | 
				
			||||||
        } 
 | 
					 | 
				
			||||||
        #endregion 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        #region WinHttp
 | 
					 | 
				
			||||||
        /// <summary>
 | 
					 | 
				
			||||||
        /// This function implements the Web Proxy Auto-Discovery (WPAD) protocol 
 | 
					 | 
				
			||||||
        /// for automatically configuring the proxy settings for an HTTP request. 
 | 
					 | 
				
			||||||
        /// The WPAD protocol downloads a Proxy Auto-Configuration (PAC) file, 
 | 
					 | 
				
			||||||
        /// which is a script that identifies the proxy server to use for a given 
 | 
					 | 
				
			||||||
        /// target URL. PAC files are typically deployed by the IT department within 
 | 
					 | 
				
			||||||
        /// a corporate network environment. The URL of the PAC file can either be 
 | 
					 | 
				
			||||||
        /// specified explicitly or WinHttpGetProxyForUrl can be instructed to 
 | 
					 | 
				
			||||||
        /// automatically discover the location of the PAC file on the local network.
 | 
					 | 
				
			||||||
        /// </summary>
 | 
					 | 
				
			||||||
        /// <param name="hSession">The WinHTTP session handle returned by the WinHttpOpen function</param>
 | 
					 | 
				
			||||||
        /// <param name="lpcwszUrl">A pointer to a null-terminated Unicode string that contains the 
 | 
					 | 
				
			||||||
        /// URL of the HTTP request that the application is preparing to send.</param>
 | 
					 | 
				
			||||||
        /// <param name="pAutoProxyOptions">A pointer to a WINHTTP_AUTOPROXY_OPTIONS structure that 
 | 
					 | 
				
			||||||
        /// specifies the auto-proxy options to use.</param>
 | 
					 | 
				
			||||||
        /// <param name="pProxyInfo">A pointer to a WINHTTP_PROXY_INFO structure that receives the 
 | 
					 | 
				
			||||||
        /// proxy setting. This structure is then applied to the request handle using the 
 | 
					 | 
				
			||||||
        /// WINHTTP_OPTION_PROXY option.</param>
 | 
					 | 
				
			||||||
        /// <returns></returns>
 | 
					 | 
				
			||||||
        [DllImport("winhttp.dll", SetLastError=true, CharSet=CharSet.Unicode)]        
 | 
					 | 
				
			||||||
        public static extern bool WinHttpGetProxyForUrl(
 | 
					 | 
				
			||||||
            IntPtr hSession,
 | 
					 | 
				
			||||||
            string lpcwszUrl,
 | 
					 | 
				
			||||||
            ref WINHTTP_AUTOPROXY_OPTIONS pAutoProxyOptions,
 | 
					 | 
				
			||||||
            ref WINHTTP_PROXY_INFO pProxyInfo); 
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        /// <summary>
 | 
					 | 
				
			||||||
        /// The function initializes, for an application, the use of WinHTTP 
 | 
					 | 
				
			||||||
        /// functions and returns a WinHTTP-session handle
 | 
					 | 
				
			||||||
        /// </summary>
 | 
					 | 
				
			||||||
        /// <param name="pwszUserAgent">A pointer to a string variable that contains the name of the 
 | 
					 | 
				
			||||||
        /// application or entity calling the WinHTTP functions.</param>
 | 
					 | 
				
			||||||
        /// <param name="dwAccessType">Type of access required. This can be one of the following values</param>
 | 
					 | 
				
			||||||
        /// <param name="pwszProxyName"> A pointer to a string variable that contains the name of the 
 | 
					 | 
				
			||||||
        /// proxy server to use when proxy access is specified by setting dwAccessType to 
 | 
					 | 
				
			||||||
        /// WINHTTP_ACCESS_TYPE_NAMED_PROXY. The WinHTTP functions recognize only CERN type proxies for HTTP. 
 | 
					 | 
				
			||||||
        /// If dwAccessType is not set to WINHTTP_ACCESS_TYPE_NAMED_PROXY, this parameter must be set 
 | 
					 | 
				
			||||||
        /// to WINHTTP_NO_PROXY_NAME</param>
 | 
					 | 
				
			||||||
        /// <param name="pwszProxyBypass">A pointer to a string variable that contains an optional list 
 | 
					 | 
				
			||||||
        /// of host names or IP addresses, or both, that should not be routed through the proxy when 
 | 
					 | 
				
			||||||
        /// dwAccessType is set to WINHTTP_ACCESS_TYPE_NAMED_PROXY. The list can contain wildcard characters. 
 | 
					 | 
				
			||||||
        /// Do not use an empty string, because the WinHttpOpen function uses it as the proxy bypass list. 
 | 
					 | 
				
			||||||
        /// If this parameter specifies the "<local>" macro as the only entry, this function bypasses 
 | 
					 | 
				
			||||||
        /// any host name that does not contain a period. If dwAccessType is not set to WINHTTP_ACCESS_TYPE_NAMED_PROXY, 
 | 
					 | 
				
			||||||
        /// this parameter must be set to WINHTTP_NO_PROXY_BYPASS.</param>
 | 
					 | 
				
			||||||
        /// <param name="dwFlags">Unsigned long integer value that contains the flags that indicate various options 
 | 
					 | 
				
			||||||
        /// affecting the behavior of this function</param>
 | 
					 | 
				
			||||||
        /// <returns>Returns a valid session handle if successful, or NULL otherwise</returns>
 | 
					 | 
				
			||||||
        [DllImport("winhttp.dll", SetLastError=true, CharSet=CharSet.Unicode)]
 | 
					 | 
				
			||||||
        public static extern IntPtr WinHttpOpen(
 | 
					 | 
				
			||||||
            string pwszUserAgent,
 | 
					 | 
				
			||||||
            int dwAccessType,
 | 
					 | 
				
			||||||
            IntPtr pwszProxyName,
 | 
					 | 
				
			||||||
            IntPtr pwszProxyBypass,
 | 
					 | 
				
			||||||
            int dwFlags
 | 
					 | 
				
			||||||
            );
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        /// <summary>
 | 
					 | 
				
			||||||
        /// The function closes a single HINTERNET handle
 | 
					 | 
				
			||||||
        /// </summary>
 | 
					 | 
				
			||||||
        /// <param name="hInternet">Valid HINTERNET handle to be closed.</param>
 | 
					 | 
				
			||||||
        /// <returns>Returns TRUE if the handle is successfully closed, or FALSE otherwise</returns>
 | 
					 | 
				
			||||||
        [DllImport("winhttp.dll", SetLastError=true, CharSet=CharSet.Unicode)]
 | 
					 | 
				
			||||||
        public static extern bool WinHttpCloseHandle(IntPtr hInternet);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        #endregion
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        [DllImport("kernel32.dll")]
 | 
					 | 
				
			||||||
        public static extern int GetLastError(); 
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,10 +0,0 @@
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  "version": "0.1-alpha",
 | 
					 | 
				
			||||||
  "authors": ["ilyaigpetrov"],
 | 
					 | 
				
			||||||
  "description": "A wonderful library that does nice stuff",
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  "code": ["**/*.cs"],
 | 
					 | 
				
			||||||
  "frameworks": {
 | 
					 | 
				
			||||||
    "dnx451": { }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,14 +0,0 @@
 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  "locked": false,
 | 
					 | 
				
			||||||
  "version": 2,
 | 
					 | 
				
			||||||
  "targets": {
 | 
					 | 
				
			||||||
    "DNX,Version=v4.5.1": {},
 | 
					 | 
				
			||||||
    "DNX,Version=v4.5.1/win7-x86": {},
 | 
					 | 
				
			||||||
    "DNX,Version=v4.5.1/win7-x64": {}
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
  "libraries": {},
 | 
					 | 
				
			||||||
  "projectFileDependencyGroups": {
 | 
					 | 
				
			||||||
    "": [],
 | 
					 | 
				
			||||||
    "DNX,Version=v4.5.1": []
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,2 +0,0 @@
 | 
				
			||||||
Dual-scale-D3-Bar-Chart
 | 
					 | 
				
			||||||
========================
 | 
					 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 14 KiB  | 
| 
						 | 
					@ -1,9 +0,0 @@
 | 
				
			||||||
approach	memHit	timeHit	memMiss	timeMiss
 | 
					 | 
				
			||||||
Hosts reversed binary	109	3704594	96	602820
 | 
					 | 
				
			||||||
Hosts binary	351	3718253	210	605188
 | 
					 | 
				
			||||||
Hosts plain switch	367	2874843	88	607200
 | 
					 | 
				
			||||||
Hosts hash	347	5062512	207	609278
 | 
					 | 
				
			||||||
Hosts switch	88	894410	77	614169
 | 
					 | 
				
			||||||
IPs switch	37	1348111	72	597439
 | 
					 | 
				
			||||||
IPs indexOf	35	4853437	72	599850
 | 
					 | 
				
			||||||
IPs binary	31	3542401	77	602958
 | 
					 | 
				
			||||||
		
		
			
  | 
| 
						 | 
					@ -1,182 +0,0 @@
 | 
				
			||||||
<!DOCTYPE html>
 | 
					 | 
				
			||||||
<meta charset="utf-8">
 | 
					 | 
				
			||||||
<style>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
body {
 | 
					 | 
				
			||||||
  font: 12px Tahoma;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.y.axisRight text {
 | 
					 | 
				
			||||||
    fill: orange;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.y.axisLeft text {
 | 
					 | 
				
			||||||
    fill: steelblue;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.axis path,
 | 
					 | 
				
			||||||
.axis line {
 | 
					 | 
				
			||||||
  fill: none;
 | 
					 | 
				
			||||||
  stroke: #000;
 | 
					 | 
				
			||||||
  shape-rendering: crispEdges;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.timeMiss {
 | 
					 | 
				
			||||||
  fill: red;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.memMiss {
 | 
					 | 
				
			||||||
  fill: blue;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.timeHit {
 | 
					 | 
				
			||||||
  fill: orange;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.memHit {
 | 
					 | 
				
			||||||
  fill: steelblue;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.x.axis path {
 | 
					 | 
				
			||||||
  display: none;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
</style>
 | 
					 | 
				
			||||||
<body>
 | 
					 | 
				
			||||||
<script src="http://d3js.org/d3.v3.min.js"></script>
 | 
					 | 
				
			||||||
<script>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var margin = {top: 80, right: 80, bottom: 80, left: 80},
 | 
					 | 
				
			||||||
    width = 1000 - margin.left - margin.right,
 | 
					 | 
				
			||||||
    height = 400 - margin.top - margin.bottom;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var x = d3.scale.ordinal()
 | 
					 | 
				
			||||||
    .rangeRoundBands([0, width], .1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var y0 = d3.scale.linear().domain([0, 400]).range([height, 0]);
 | 
					 | 
				
			||||||
var y1 = d3.scale.linear().domain([0, 6000000]).range([height, 0]);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var xAxis = d3.svg.axis()
 | 
					 | 
				
			||||||
    .scale(x)
 | 
					 | 
				
			||||||
    .orient("bottom");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// create left yAxis
 | 
					 | 
				
			||||||
var yAxisLeft = d3.svg.axis().scale(y0).ticks(4).orient("left");
 | 
					 | 
				
			||||||
// create right yAxis
 | 
					 | 
				
			||||||
var yAxisRight = d3.svg.axis().scale(y1).ticks(6).orient("right");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var svg = d3.select("body").append("svg")
 | 
					 | 
				
			||||||
    .attr("width", width + margin.left + margin.right)
 | 
					 | 
				
			||||||
    .attr("height", height + margin.top + margin.bottom)
 | 
					 | 
				
			||||||
    .append("g")
 | 
					 | 
				
			||||||
    .attr("class", "graph")
 | 
					 | 
				
			||||||
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
function type(d) {
 | 
					 | 
				
			||||||
  d.memMiss = +d.memMiss;
 | 
					 | 
				
			||||||
  return d;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
d3.tsv("data.tsv", type, function(error, data) {
 | 
					 | 
				
			||||||
  x.domain(data.map( d => d.approach ));
 | 
					 | 
				
			||||||
  //y0.domain([0, d3.max(data, d => Math.max(d.memHit, d.memMiss) )]);
 | 
					 | 
				
			||||||
  //y1.domain([0, d3.max(data, d => Math.max(d.timeHit, d.timeMiss) )]);
 | 
					 | 
				
			||||||
  
 | 
					 | 
				
			||||||
  svg.append("g")
 | 
					 | 
				
			||||||
      .attr("class", "x axis")
 | 
					 | 
				
			||||||
      .attr("transform", "translate(0," + height + ")")
 | 
					 | 
				
			||||||
      .call(xAxis);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  svg.append("g")
 | 
					 | 
				
			||||||
	  .attr("class", "y axis axisLeft")
 | 
					 | 
				
			||||||
	  .attr("transform", "translate(0,0)")
 | 
					 | 
				
			||||||
	  .call(yAxisLeft)
 | 
					 | 
				
			||||||
	  .append("text")
 | 
					 | 
				
			||||||
	  .attr("y", 6)
 | 
					 | 
				
			||||||
	  .attr("dy", "-2em")
 | 
					 | 
				
			||||||
	  .attr("dx", "-2em")
 | 
					 | 
				
			||||||
	  .style("text-anchor", "right")
 | 
					 | 
				
			||||||
	  .text("bytes per request");
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
  svg.append("g")
 | 
					 | 
				
			||||||
	  .attr("class", "y axis axisRight")
 | 
					 | 
				
			||||||
	  .attr("transform", "translate(" + (width) + ",0)")
 | 
					 | 
				
			||||||
	  .call(yAxisRight)
 | 
					 | 
				
			||||||
	  .append("text")
 | 
					 | 
				
			||||||
	  .attr("y", 6)
 | 
					 | 
				
			||||||
	  .attr("dy", "-2em")
 | 
					 | 
				
			||||||
	  .attr("dx", "-1em")
 | 
					 | 
				
			||||||
	  .style("text-anchor", "start")	  
 | 
					 | 
				
			||||||
	  .text("ns per request");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  bars = svg.selectAll(".bar").data(data).enter();
 | 
					 | 
				
			||||||
  
 | 
					 | 
				
			||||||
  bars.append("rect")
 | 
					 | 
				
			||||||
      .attr("class", "memHit")
 | 
					 | 
				
			||||||
	  .attr("width", x.rangeBand()*0.25*0.5 )
 | 
					 | 
				
			||||||
      .attr("x", d => x(d.approach) + x.rangeBand()*0.25 )
 | 
					 | 
				
			||||||
      .attr("y", d => y0(d.memHit) )
 | 
					 | 
				
			||||||
	  .attr("height", (d,i,j) => height - y0(d.memHit) ); 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  bars.append("rect")
 | 
					 | 
				
			||||||
      .attr("class", "timeHit")
 | 
					 | 
				
			||||||
      .attr("x", d => x(d.approach) + x.rangeBand()*0.25*1.5 )
 | 
					 | 
				
			||||||
      .attr("width", x.rangeBand()*0.25*0.5 )
 | 
					 | 
				
			||||||
      .attr("y", d => y1(d.timeHit) )
 | 
					 | 
				
			||||||
	  .attr("height", (d,i,j) => height - y1(d.timeHit) ); 
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
  bars.append("rect")
 | 
					 | 
				
			||||||
      .attr("class", "memMiss")
 | 
					 | 
				
			||||||
      .attr("x", d => x(d.approach) + x.rangeBand()*0.25*2 )
 | 
					 | 
				
			||||||
      .attr("width", x.rangeBand()*0.25*0.5 )
 | 
					 | 
				
			||||||
      .attr("y", d => y0(d.memMiss) )
 | 
					 | 
				
			||||||
	  .attr("height", (d,i,j) => height - y0(d.memMiss) ); 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  bars.append("rect")
 | 
					 | 
				
			||||||
      .attr("class", "timeMiss")
 | 
					 | 
				
			||||||
      .attr("x", d => x(d.approach) + x.rangeBand()*0.25*2.5 )
 | 
					 | 
				
			||||||
      .attr("width", x.rangeBand()*0.25*0.5 )
 | 
					 | 
				
			||||||
      .attr("y", d => y1(d.timeMiss) )
 | 
					 | 
				
			||||||
	  .attr("height", (d,i,j) => height - y1(d.timeMiss) ); 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // add legend   
 | 
					 | 
				
			||||||
  var color_hash = {  
 | 
					 | 
				
			||||||
	0 : ["Time / Miss", "red"],
 | 
					 | 
				
			||||||
	1 : ["Memory / Miss", "blue"],
 | 
					 | 
				
			||||||
	2 : ["Time / Hit", "orange"],
 | 
					 | 
				
			||||||
	3 : ["Memory / Hit", "steelblue"]
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  var legend = svg.append("g")
 | 
					 | 
				
			||||||
    .attr("class", "legend")
 | 
					 | 
				
			||||||
    .attr("x", width - 65)
 | 
					 | 
				
			||||||
    .attr("y", 25)
 | 
					 | 
				
			||||||
    .attr("height", 100)
 | 
					 | 
				
			||||||
    .attr("width", 100);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  legend.selectAll('g')
 | 
					 | 
				
			||||||
    .data(data)
 | 
					 | 
				
			||||||
    .enter()
 | 
					 | 
				
			||||||
    .append('g')
 | 
					 | 
				
			||||||
	.each(function(d, i) {
 | 
					 | 
				
			||||||
	  if(i > 3)
 | 
					 | 
				
			||||||
		return; // Approach.
 | 
					 | 
				
			||||||
	  var g = d3.select(this);
 | 
					 | 
				
			||||||
	  g.append("rect")
 | 
					 | 
				
			||||||
	    .attr("x", width - x.rangeBand()*3.5 - 15)
 | 
					 | 
				
			||||||
	    .attr("y", i*25)
 | 
					 | 
				
			||||||
	    .attr("width", 10)
 | 
					 | 
				
			||||||
	    .attr("height", 10)
 | 
					 | 
				
			||||||
	    .style("fill", color_hash[i][1]);
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		g.append("text")
 | 
					 | 
				
			||||||
	      .attr("x", width - x.rangeBand()*3.5)
 | 
					 | 
				
			||||||
	      .attr("y", i * 25 + 8)
 | 
					 | 
				
			||||||
	      .attr("height",30)
 | 
					 | 
				
			||||||
	      .attr("width",100)
 | 
					 | 
				
			||||||
	      .style("fill", color_hash[i][1])
 | 
					 | 
				
			||||||
	      .text(color_hash[i][0]);
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
</script>
 | 
					 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user