- Timestamp:
- 03/11/17 12:42:31 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/PushGP/HeuristicLab.PushGP/TestPooling/Pool/ManagedPool2.cs
r14744 r14745 1 using System.Collections.Generic;1 //using System.Collections.Generic; 2 2 3 namespace TestPooling.Pool {4 using System;5 using System.Collections.Concurrent;6 using System.IO;7 using System.Linq;8 using System.Runtime.Serialization.Formatters.Binary;3 //namespace TestPooling.Pool { 4 // using System; 5 // using System.Collections.Concurrent; 6 // using System.IO; 7 // using System.Linq; 8 // using System.Runtime.Serialization.Formatters.Binary; 9 9 10 public class ManagedPool2<T> : IDisposable where T : class {10 // public class ManagedPool2<T> : IDisposable where T : class { 11 11 12 private static readonly ConcurrentStack<T[]> Pool = new ConcurrentStack<T[]>();12 // private static readonly ConcurrentStack<T[]> Pool = new ConcurrentStack<T[]>(); 13 13 14 private readonly T[] DummyPartition; 15 private readonly Func<T> Factory; 16 public readonly int PartitionSize; 14 // private readonly T[] DummyPartition; 15 // public readonly int PartitionSize; 17 16 18 private readonly IList<T[]> partitions = new List<T[]>();19 private T[] currentPartition;20 private int entryIndex;17 // private readonly IList<T[]> partitions = new List<T[]>(); 18 // private T[] currentPartition; 19 // private int entryIndex; 21 20 22 public ManagedPool2(int partitionSize, T[] dummyPartition, Func<T> factory) { 23 PartitionSize = partitionSize; 24 Factory = factory; 25 entryIndex = partitionSize; 21 // public ManagedPool2(int partitionSize, T[] dummyPartition) { 22 // PartitionSize = partitionSize; 23 // entryIndex = partitionSize; 26 24 27 DummyPartition = dummyPartition;28 }25 // DummyPartition = dummyPartition; 26 // } 29 27 30 public T Get() {31 if (entryIndex == PartitionSize) {32 currentPartition = GetPartition();33 partitions.Add(currentPartition);34 entryIndex = 0;35 }28 // public T Get() { 29 // if (entryIndex == PartitionSize) { 30 // currentPartition = GetPartition(); 31 // partitions.Add(currentPartition); 32 // entryIndex = 0; 33 // } 36 34 37 return currentPartition[entryIndex++];38 }35 // return currentPartition[entryIndex++]; 36 // } 39 37 40 private T[] GetPartition() { 41 //T[] partition; 38 // private T[] GetPartition() { 39 // T[] partition; 40 // return (Pool.TryPop(out partition)) ? partition : DeepArrayCopy(DummyPartition); 41 // } 42 42 43 //partition = Pool.TryPop(out partition) ? partition : new T[PartitionSize]; 43 // private static T[] DeepArrayCopy(object objectToCopy) { 44 // using (var memoryStream = new MemoryStream()) { 45 // var binaryFormatter = new BinaryFormatter(); 44 46 45 //for (var i = 0; i < PartitionSize; i++) { 46 // partition[i] = Factory(); 47 //} 47 // binaryFormatter.Serialize(memoryStream, objectToCopy); 48 // memoryStream.Seek(0, SeekOrigin.Begin); 48 49 49 //return partition; 50 // return (T[])binaryFormatter.Deserialize(memoryStream); 51 // } 52 // } 50 53 51 T[] partition; 52 if (Pool.TryPop(out partition)) return partition; 53 54 //partition = new T[PartitionSize]; 55 //DummyPartition.CopyTo(partition, 0); 56 57 return DeepArrayCopy(DummyPartition); 58 } 59 60 private static T[] DeepArrayCopy(object objectToCopy) { 61 using (var memoryStream = new MemoryStream()) { 62 var binaryFormatter = new BinaryFormatter(); 63 64 binaryFormatter.Serialize(memoryStream, objectToCopy); 65 memoryStream.Seek(0, SeekOrigin.Begin); 66 67 return (T[])binaryFormatter.Deserialize(memoryStream); 68 } 69 } 70 71 public void Dispose() { 72 Pool.PushRange(partitions.ToArray()); 73 } 74 } 75 } 54 // public void Dispose() { 55 // Pool.PushRange(partitions.ToArray()); 56 // partitions.Clear(); 57 // } 58 // } 59 //}
Note: See TracChangeset
for help on using the changeset viewer.