private static bool RunJoinTest3(int leftSize, int rightSize, int loops) { TestHarness.TestLog("RunJoinTest3({0}, {1}, {2})", leftSize, rightSize, loops); Wrapped <int>[] left = new Wrapped <int> [leftSize]; Wrapped <int>[] right = new Wrapped <int> [rightSize]; for (int i = 0; i < left.Length; i++) { left[i] = new Wrapped <int>(i); } for (int i = 0; i < right.Length; i++) { right[i] = new Wrapped <int>(i * right.Length); } Func <Wrapped <int>, int> identityKeySelector = delegate(Wrapped <int> x) { return(x.val); }; IEnumerable <Pair> seqQuery = Enumerable.Join <Wrapped <int>, Wrapped <int>, int, Pair>( left, right, identityKeySelector, identityKeySelector, delegate(Wrapped <int> x, Wrapped <int> y) { return(new Pair(x.val, y.val)); }); IEnumerable <Pair> parQuery = left.AsParallel().Join <Wrapped <int>, Wrapped <int>, int, Pair>( right.AsParallel(), identityKeySelector, identityKeySelector, delegate(Wrapped <int> x, Wrapped <int> y) { return(new Pair(x.val, y.val)); }); PerfHelpers.DrivePerfComparison( delegate { foreach (Pair p in seqQuery) { // Simulate work: int z = 0; for (int i = 0; i < 5; i++) { z *= p.x; z *= p.y; } } }, delegate { foreach (Pair p in parQuery) { // Simulate work: int z = 0; for (int i = 0; i < 5; i++) { z *= p.x; z *= p.y; } } }, loops); return(true); }