PK ÈqgL 03-LimitingArrayCovariance/PK ±WHTò¶h½ ½ % 03-LimitingArrayCovariance/App.config
PK ñWHBä@ì+ + 9 03-LimitingArrayCovariance/LimitingArrayCovariance.csproj
Debug
AnyCPU
{B9FACD4C-8518-4587-BCFA-3BA9AF99CDA5}
Exe
Properties
LimitingArrayCovariance
LimitingArrayCovariance
v4.5.2
512
true
AnyCPU
true
full
false
bin\Debug\
DEBUG;TRACE
prompt
4
AnyCPU
pdbonly
true
bin\Release\
TRACE
prompt
4
true
bin\x64\Debug\
DEBUG;TRACE
full
x64
prompt
MinimumRecommendedRules.ruleset
true
bin\x64\Release\
TRACE
true
pdbonly
x64
prompt
MinimumRecommendedRules.ruleset
true
PK ñWHÆ RoV V 6 03-LimitingArrayCovariance/LimitingArrayCovariance.sln
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.23107.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LimitingArrayCovariance", "LimitingArrayCovariance.csproj", "{B9FACD4C-8518-4587-BCFA-3BA9AF99CDA5}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B9FACD4C-8518-4587-BCFA-3BA9AF99CDA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B9FACD4C-8518-4587-BCFA-3BA9AF99CDA5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B9FACD4C-8518-4587-BCFA-3BA9AF99CDA5}.Debug|x64.ActiveCfg = Debug|x64
{B9FACD4C-8518-4587-BCFA-3BA9AF99CDA5}.Debug|x64.Build.0 = Debug|x64
{B9FACD4C-8518-4587-BCFA-3BA9AF99CDA5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B9FACD4C-8518-4587-BCFA-3BA9AF99CDA5}.Release|Any CPU.Build.0 = Release|Any CPU
{B9FACD4C-8518-4587-BCFA-3BA9AF99CDA5}.Release|x64.ActiveCfg = Release|x64
{B9FACD4C-8518-4587-BCFA-3BA9AF99CDA5}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
PK ´
WH|
äi
i
% 03-LimitingArrayCovariance/Program.csusing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
namespace LimitingArrayCovariance {
struct X where T : class {
private T t;
public static implicit operator T(X x) {
return x.t;
}
public static implicit operator X(T t) {
X x;
x.t = t;
return x;
}
}
public class A {
public int Value;
}
class ArrayProcessor {
public A[] Data = new A[Program.Count];
public void Initialize() {
for (int i = 0; i < Data.Length; i++) {
Data[i] = new A { Value = Program.Random.Next(Program.Count) };
}
}
public void Process() {
for (int i = 1; i < Data.Length; i++) {
A item = Data[i];
int j = i - 1;
while ((j >= 0) && (Data[j].Value > item.Value)) {
Data[j + 1] = Data[j];
j--;
}
Data[j + 1] = item;
}
}
}
class ValueArrayProcessor {
public X[] Data = new X[Program.Count];
public void Initialize(ArrayProcessor ap) {
for (int i = 0; i < Data.Length; i++) {
Data[i] = new A { Value = ap.Data[i].Value };
}
}
public void Process() {
for (int i = 1; i < Data.Length; i++) {
A item = Data[i];
int j = i - 1;
while ((j >= 0) && (((A) Data[j]).Value > item.Value)) { // The only change: "((A) Data[j]).Value" instead of "Data[j].Value"
Data[j + 1] = Data[j];
j--;
}
Data[j + 1] = item;
}
}
}
class Program {
public const int Count = 50000;
public static Random Random;
static void Main(string[] args) {
Console.WriteLine(Environment.Is64BitProcess);
Console.WriteLine("Warming up ...");
Program.Random = new Random(42);
var ap1 = new ArrayProcessor();
ap1.Initialize();
ap1.Process();
var ap2 = new ValueArrayProcessor();
ap2.Initialize(ap1);
ap2.Process();
ap1 = null;
ap2 = null;
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true);
Console.WriteLine("Generating data ...");
Program.Random = new Random(42);
ap1 = new ArrayProcessor();
ap1.Initialize();
ap2 = new ValueArrayProcessor();
ap2.Initialize(ap1);
Console.WriteLine("Running AP:");
var sw1 = Stopwatch.StartNew();
ap1.Process();
sw1.Stop();
Console.WriteLine(sw1.Elapsed);
Console.WriteLine("Running VAP with X:");
var sw2 = Stopwatch.StartNew();
ap2.Process();
sw2.Stop();
Console.WriteLine(sw2.Elapsed);
Console.WriteLine($"Speed up: {100 - (sw2.ElapsedMilliseconds / (double) sw1.ElapsedMilliseconds) * 100} %");
}
}
}
PK ÈqgL &