Free cookie consent management tool by TermsFeed Policy Generator

source: branches/PushGP/HeuristicLab.PushGP/FeatureTests/Program.cs @ 15189

Last change on this file since 15189 was 15189, checked in by pkimmesw, 7 years ago

#2665 Fixed small issues, testet benchmark suite, added INX Expressions

File size: 17.5 KB
Line 
1using System.Threading.Tasks;
2
3namespace TestPooling {
4  using System;
5  using System.Collections.Generic;
6  using System.Diagnostics;
7  using System.Linq;
8  using System.Text;
9  using System.Threading;
10  using DirtyList;
11  using HeuristicLab.Problems.ProgramSynthesis.Push.Configuration;
12  using HeuristicLab.Problems.ProgramSynthesis.Push.Data.Pool;
13  using HeuristicLab.Problems.ProgramSynthesis.Push.Expressions;
14  using HeuristicLab.Problems.ProgramSynthesis.Push.Generators.CodeGenerator;
15  using HeuristicLab.Problems.ProgramSynthesis.Push.Interpreter;
16  using HeuristicLab.Problems.ProgramSynthesis.Push.Parser;
17  using HeuristicLab.Problems.ProgramSynthesis.Push.Simplifier;
18  using HeuristicLab.Problems.ProgramSynthesis.Push.Stack;
19  using HeuristicLab.Random;
20
21  class Program {
22    private const int PartitionSize = 512;
23    private const int ExampleCount = 200;
24    private const int InstanceCount = 1024;
25    private const int PopulationCount = 100;
26
27    private static int TotalInstanceCount => PopulationCount * InstanceCount * ExampleCount;
28
29    static void Main(string[] args) {
30      //Test1();
31      //Test1_2();
32      //Test3();
33
34      //TestCollectionPooling();
35
36      //DirtyListTest();
37
38      //TestAddRangeNConcat();
39
40      //TestStacks();
41
42      //SimpleTest();
43      //Stepwise().Wait();
44      //PerformanceTestInterpreter();
45      //PerformanceParallelTestInterpreter();
46      //PerformanceTestLinearCodeGenerator();
47      //TestRobustness();
48      //TestPool();
49      //TestPoolPerformance();
50      //TestSimplifier();
51      //FlagsTest();
52      //TestExpressionDependencies();
53      //TestSplitLogic();
54      TestStringBuilder();
55
56      Console.WriteLine("\nPress any key to continue...");
57      Console.ReadKey(false);
58    }
59
60    private static void TestStringBuilder() {
61      var sb = new StringBuilder();
62      sb.Append("test");
63
64      var s1 = sb.ToString();
65      var s2 = sb.ToString();
66
67      // false
68      var equal = ReferenceEquals(s1, s2);
69    }
70
71    private static void TestSplitLogic() {
72      var sw = new Stopwatch();
73      var iMax = 100000000u;
74      var repeats = 10;
75      var or = new BooleanOrExpression();
76      var and = new BooleanAndExpression();
77      var ors = new Expression[iMax];
78      var ands = new Expression[iMax];
79      var booleans = new bool[iMax];
80
81      for (var i = 0u; i < iMax; i++) {
82        ors[i] = or;
83        ands[i] = and;
84        booleans[i] = i % 2 == 0;
85      }
86
87      var orsProgram = new PushProgram(ors);
88      var andsProgram = new PushProgram(ands);
89
90      using (var interpreter = new PushInterpreter()) {
91        for (var i = 0u; i < repeats; i++) {
92          interpreter.BooleanStack.Push(booleans);
93
94          sw.Start();
95          interpreter.Run(orsProgram);
96          sw.Stop();
97          interpreter.Reset();
98        }
99
100        Console.WriteLine("ors:\t" + sw.ElapsedTicks / repeats + " - " + sw.ElapsedMilliseconds);
101
102        sw.Reset();
103        interpreter.Reset();
104
105        for (var i = 0u; i < repeats; i++) {
106          interpreter.BooleanStack.Push(booleans);
107
108          sw.Start();
109          interpreter.Run(andsProgram);
110          sw.Stop();
111          interpreter.Reset();
112        }
113
114        Console.WriteLine("ands:\t" + sw.ElapsedTicks / repeats + " - " + sw.ElapsedMilliseconds);
115
116        sw.Reset();
117        interpreter.Reset();
118
119        for (var i = 0u; i < repeats; i++) {
120          interpreter.BooleanStack.Push(booleans);
121
122          sw.Start();
123          interpreter.Run(orsProgram);
124          sw.Stop();
125          interpreter.Reset();
126        }
127
128        Console.WriteLine("ors:\t" + sw.ElapsedTicks / repeats + " - " + sw.ElapsedMilliseconds);
129
130        sw.Reset();
131        interpreter.Reset();
132
133        for (var i = 0u; i < repeats; i++) {
134          interpreter.BooleanStack.Push(booleans);
135
136          sw.Start();
137          interpreter.Run(andsProgram);
138          sw.Stop();
139          interpreter.Reset();
140        }
141
142        Console.WriteLine("ands:\t" + sw.ElapsedTicks / repeats + " - " + sw.ElapsedMilliseconds);
143      }
144    }
145
146    private static void TestExpressionDependencies() {
147      var enabledExpressions = ExpressionTable.GetExpressionsByStackTypes(StackTypes.Boolean | StackTypes.Integer);
148    }
149
150    private static void FlagsTest() {
151      var types = StackTypes.Boolean | StackTypes.Char | StackTypes.Integer;
152
153      StackTypes test1 = (StackTypes)(StackTypes.Boolean - types);
154      StackTypes test2 = (StackTypes)((StackTypes.Boolean | StackTypes.Float) - types);
155      StackTypes test3 = ((StackTypes.Boolean | StackTypes.Float) & types);
156      StackTypes test4 = ((StackTypes.Boolean | StackTypes.Float) ^ types);
157      StackTypes test5 = ((StackTypes.Boolean | StackTypes.Float) | types);
158      StackTypes test6 = (StackTypes.Boolean | StackTypes.Float) & ~types;
159      StackTypes test7 = StackTypes.Boolean & ~types;
160    }
161
162    private static void TestStacks() {
163      var sw = new Stopwatch();
164      var stack = new DirtyList.PushStack<int>();
165      var stack2 = new PushStack2<int>();
166      var stack3 = new PushStack3<int>();
167      var listC = new List<int>(1000);
168      var count = 200000;
169      var repeats = 10;
170
171      for (var i = 0; i < 100; i++) {
172        listC.Add(i);
173      }
174
175      sw.Start();
176      for (var j = 0; j < repeats; j++) {
177        stack.Clear();
178
179        for (int i = 0; i < count; i++) {
180          stack.Push(listC);
181        }
182      }
183      sw.Stop();
184
185      Console.WriteLine("{0}", sw.ElapsedMilliseconds / repeats);
186
187      sw.Restart();
188      for (var j = 0; j < repeats; j++) {
189        stack2.Clear();
190
191        for (int i = 0; i < count; i++) {
192          stack2.PushRange(listC);
193        }
194      }
195      sw.Stop();
196
197      Console.WriteLine("{0}", sw.ElapsedMilliseconds / repeats);
198
199      sw.Restart();
200      for (var j = 0; j < repeats; j++) {
201        stack3.Clear();
202
203        for (int i = 0; i < count; i++) {
204          stack3.PushRange(listC);
205        }
206      }
207      sw.Stop();
208
209      Console.WriteLine("{0}", sw.ElapsedMilliseconds / repeats);
210
211      sw.Restart();
212      for (int i = 0; i < count * listC.Count; i++) {
213        stack.Pop();
214      }
215
216      Console.WriteLine("{0}", sw.ElapsedMilliseconds);
217
218      sw.Restart();
219      for (int i = 0; i < count * listC.Count; i++) {
220        stack2.Pop();
221      }
222
223      Console.WriteLine("{0}", sw.ElapsedMilliseconds);
224
225
226    }
227
228    private static void TestAddRangeNConcat() {
229      var sw = new Stopwatch();
230      var count = 10000;
231      var listA = new List<int>();
232      var listB = new List<int>();
233      var listC = new List<int>(1000);
234
235      for (var i = 0; i < 1000; i++) {
236        listC.Add(i);
237      }
238
239      sw.Start();
240      for (int i = 0; i < count; i++) {
241        listA.AddRange(listC);
242      }
243      sw.Stop();
244
245      Console.WriteLine("{0}", sw.ElapsedMilliseconds);
246
247      sw.Restart();
248      for (int i = 0; i < count; i++) {
249        listB = listB.Concat(listC).ToList();
250      }
251      sw.Stop();
252
253      Console.WriteLine("{0}", sw.ElapsedMilliseconds);
254
255    }
256
257    private static void DirtyListTest() {
258      var sw = new Stopwatch();
259      var provider = new ManagedPoolProvider<Person>(100, () => new Person());
260      var provider2 = new ManagedPoolProvider<Person>(100, () => new Person());
261      var dl = new DirtyList<Person>();
262      var l = new List<Person>();
263
264      sw.Start();
265      for (var i = 0; i < 30000000; i++) {
266        using (var pool = provider.CreatePool()) {
267          for (var j = 0; j < 2; j++) {
268            var person = pool.Get();
269            person.Age = i + j;
270            person.Name = (i + j).ToString();
271
272            dl.Add(person);
273          }
274        }
275
276        dl.Clear();
277      }
278      sw.Stop();
279
280      Console.WriteLine("DirtyList: {0}", sw.Elapsed.TotalSeconds);
281
282      sw.Restart();
283      for (var i = 0; i < 30000000; i++) {
284        using (var pool = provider2.CreatePool()) {
285          for (var j = 0; j < 2; j++) {
286            var person = pool.Get();
287            person.Age = i + j;
288            person.Name = (i + j).ToString();
289
290            l.Add(person);
291          }
292        }
293
294        l.Clear();
295      }
296      sw.Stop();
297
298      Console.WriteLine("List: {0}", sw.Elapsed.TotalSeconds);
299    }
300
301    private static void TestCollectionPooling() {
302      var sw = new Stopwatch();
303      sw.Start();
304
305      var provider = new ManagedPoolProvider<PooledList<Person>>(PartitionSize, () => new PooledList<Person>());
306
307      Parallel.For(0, PopulationCount, pc => {
308        for (var e = 0; e < ExampleCount; e++) {
309          using (var pool = provider.CreatePool()) {
310            var list = pool.Get();
311
312            for (var i = 0; i < InstanceCount; i++)
313              list.Add(new Person {
314                Age = pc + e + i,
315                Name = string.Format("{0} - {1} - {2}", pc, e, i)
316              });
317          }
318        }
319      });
320      sw.Stop();
321
322      Console.WriteLine("Collection Pooling - Duration: {0} - {1} for {2}/{3} instances", sw.ElapsedTicks, sw.Elapsed.TotalSeconds, provider.InstanceCount, TotalInstanceCount);
323    }
324
325    private static void Test1_2() {
326      var sw = new Stopwatch();
327      sw.Start();
328
329      var provider = new ManagedPoolProvider<Person>(PartitionSize, () => new Person());
330
331      Parallel.For(0, PopulationCount, pc => {
332        for (var e = 0; e < ExampleCount; e++) {
333          using (var pool = provider.CreatePool()) {
334            for (var i = 0; i < InstanceCount; i++) {
335              var person = pool.Get();
336              person.Age = pc + e + i;
337              person.Name = string.Format("{0} - {1} - {2}", pc, e, i);
338            }
339          }
340        }
341      });
342      sw.Stop();
343
344      Console.WriteLine("1_2 - Duration: {0} - {1} for {2}/{3} instances", sw.ElapsedTicks, sw.Elapsed.TotalSeconds, provider.InstanceCount, TotalInstanceCount);
345    }
346
347    private static void Test3() {
348      var count = 0;
349      var sw = new Stopwatch();
350
351      sw.Start();
352      Parallel.For(0, PopulationCount, pc => {
353        for (var e = 0; e < ExampleCount; e++) {
354          var list = new Person[InstanceCount];
355          for (var i = 0; i < InstanceCount; i++) {
356            list[i] = new Person {
357              Age = pc + e + i,
358              Name = string.Format("{0} - {1} - {2}", pc, e, i)
359            };
360          }
361
362          Interlocked.Add(ref count, list.Length);
363        }
364      });
365      sw.Stop();
366
367      Console.WriteLine("3 - Duration: {0} - {1}", sw.ElapsedTicks, sw.Elapsed.TotalSeconds);
368      Console.WriteLine("PartitionSize: {0}", count);
369    }
370
371    private static void Test2() {
372      var pool = new ObjectPool<Person>(() => new Person(), 2048);
373
374      Parallel.For(0, 10000, i => {
375        for (var j = 0; j < 3000; j++) {
376          var person = pool.Allocate();
377          person.Age = i + j;
378          person.Name = string.Format("{0} - {1}", i, j);
379        }
380
381        //pool.Free()
382      });
383    }
384
385    static void SimpleTest() {
386      var interpreter = new PushInterpreter();
387
388      interpreter.Run("5 INTEGER.DUP INTEGER.+");
389
390      interpreter.PrintStacks();
391    }
392
393    static async Task Stepwise() {
394      var interpreter = new PushInterpreter();
395
396      interpreter.Run("( 0 2 CODE.QUOTE ( 1 INTEGER.+ 0 3 CODE.QUOTE ( 1 INTEGER.+ INTEGER.* ) CODE.DO*RANGE INTEGER.+ ) CODE.DO*RANGE )");
397
398      while (!interpreter.IsCompleted) {
399        Console.Clear();
400        interpreter.PrintStacks();
401        interpreter.Step();
402
403        var input = Console.ReadKey();
404        if (input.Key == ConsoleKey.Escape) {
405          break;
406        } else if (input.Key == ConsoleKey.Spacebar) {
407          await interpreter.ResumeAsync();
408        }
409      }
410
411      Console.Clear();
412      interpreter.PrintStacks();
413    }
414
415    static void PerformanceTestInterpreter() {
416      var program = PushParser.Parse("( 5 INTEGER.DUP INTEGER.+ )");
417
418      var interpreter = new PushInterpreter();
419      var sw = new Stopwatch();
420
421      sw.Start();
422      for (var i = 0; i < 60000000; i++) {
423        interpreter.Run(program);
424        interpreter.Clear();
425      }
426      sw.Stop();
427
428      Console.WriteLine(sw.Elapsed);
429    }
430
431    static void PerformanceParallelTestInterpreter() {
432      var program = PushParser.Parse("( 5 INTEGER.DUP INTEGER.+ )");
433
434      var sw = new Stopwatch();
435      var iterations = 100;
436      var amount = 600000;
437      var pool = new PushInterpreterPool(iterations, 1024);
438
439      sw.Start();
440      Parallel.For(0, iterations, i => {
441        using (var interpreter = pool.Create()) {
442          for (var j = 0; j < amount; j++) {
443            interpreter.Run(program);
444            interpreter.Clear();
445          }
446        }
447      });
448      sw.Stop();
449
450      Console.WriteLine(sw.Elapsed);
451    }
452
453    static void PerformanceTestRecursiveCodeGenerator() {
454      var sw = new Stopwatch();
455      var random = new FastRandom(1337);
456
457      sw.Start();
458      var expressions = RecursiveCodeGenerator.RandomCode(60000000, random).ToList();
459      sw.Stop();
460
461      Console.WriteLine("Generated {0} in {1}", expressions.Count, sw.Elapsed);
462    }
463
464    static void PerformanceTestLinearCodeGenerator() {
465      var sw = new Stopwatch();
466      var random = new FastRandom(1337);
467      var config = new PushConfiguration();
468
469      sw.Start();
470      var expressions = LinearCodeGenerator.RandomCode(60000000, null, random, config).ToList();
471      sw.Stop();
472
473      Console.WriteLine("Generated {0} in {1}", expressions.Count, sw.Elapsed);
474    }
475
476    static void TestRobustness() {
477      var sw = new Stopwatch();
478      var parallelism = Environment.ProcessorCount;
479      var maxProgramSizeLimit = 1024;
480      var partitionSize = 100000;
481      var execCounters = new long[parallelism];
482
483      var config = new PushConfiguration {
484        EvalPushLimit = 1024,
485        MaxPointsInProgram = 1024
486      };
487
488      config.DisableStack(StackTypes.Exec);
489      config.DisableStack(StackTypes.Code);
490      config.DisableStack(StackTypes.Float);
491
492      var errors = config.EnabledExpressions.Where(
493        name => {
494          var type = ExpressionTable.NameToTypeTable[name];
495          var attribute = ExpressionTable.TypeToAttributeTable[type];
496
497          return attribute.StackType == StackTypes.Exec
498              || attribute.AdditionalStackDependencies.HasFlag(StackTypes.Exec)
499              || attribute.StackType == StackTypes.Code
500              || attribute.AdditionalStackDependencies.HasFlag(StackTypes.Code)
501              || attribute.StackType == StackTypes.Float
502              || attribute.AdditionalStackDependencies.HasFlag(StackTypes.Float);
503        });
504
505      var pool = new PushInterpreterPool(config);
506
507      sw.Start();
508      Parallel.For(0, parallelism, i => {
509        var random = new FastRandom(1337);
510
511        using (var interpreter = pool.Create(random)) {
512          for (var j = 0; j < partitionSize; j++) {
513            var program = LinearCodeGenerator.RandomProgram(maxProgramSizeLimit, random, config);
514            interpreter.Run(program);
515
516            execCounters[i] += interpreter.ExecCounter;
517            interpreter.Reset();
518          }
519        }
520      });
521      sw.Stop();
522
523      Console.WriteLine("ExecCount: {0}", execCounters.Sum());
524      Console.WriteLine("Duration: {0}", sw.Elapsed);
525    }
526
527    static void TestPool() {
528      var pool = new PushInterpreterPool();
529      var normal = new PushInterpreter();
530      int id;
531
532      using (var interpreter = pool.Create()) {
533        interpreter.Run("( 1 2 INTEGER.+ )");
534
535        id = interpreter.GetHashCode();
536        if (id == normal.GetHashCode()) Console.WriteLine("equal 1");
537      }
538
539      using (var interpreter = pool.Create())
540      using (var interpreter2 = pool.Create()) {
541        interpreter.Run("( 1 2 INTEGER.+ )");
542        if (id == interpreter.GetHashCode()) Console.WriteLine("equal 2");
543        if (id == interpreter2.GetHashCode()) Console.WriteLine("equal 3");
544      }
545    }
546
547    static void TestPoolPerformance() {
548      var sw = new Stopwatch();
549      var iterations = 100000000;
550
551      sw.Start();
552      for (var i = 0; i < iterations; i++) {
553        var interpreter = new PushInterpreter();
554        interpreter.Clear();
555      }
556      sw.Stop();
557
558      Console.WriteLine(sw.Elapsed);
559
560      var pool = new PushInterpreterPool();
561      sw.Restart();
562      for (var i = 0; i < iterations; i++) {
563        using (var interpreter = pool.Create()) {
564          interpreter.Clear();
565        }
566      }
567      sw.Stop();
568
569      Console.WriteLine(sw.Elapsed);
570    }
571
572    static void TestSimplifier() {
573      var program = PushParser.ParseProgram("( 5 ( INTEGER.DUP FLOAT.+ FLOAT.- ) ( EXEC.DO ( EXEC.IF ) EXEC.Y ) INTEGER.+ )");
574      var pool = new PushInterpreterPool();
575      var random = new FastRandom(1337);
576
577      var randomProg = LinearCodeGenerator.RandomProgram(4096 * 4, random);    // 53
578
579      Func<PushProgram, double> evaluator = prog => {
580        using (var interpreter = pool.Create(random)) {
581          interpreter.Run(prog);
582          return interpreter.IntegerStack.IsEmpty
583            ? double.MaxValue
584            : Math.Abs(interpreter.IntegerStack.Top - 10);
585        }
586      };
587
588      var simplerProgram = Simplifier.Simplify(program, pool.PushConfiguration, evaluator);
589
590      Console.WriteLine(simplerProgram);
591    }
592  }
593
594  [Serializable]
595  class Person : IPooledObject {
596    public string Name { get; set; }
597    public int Age { get; set; }
598
599    public void Reset() {
600      Age = default(int);
601      Name = null;
602    }
603  }
604}
Note: See TracBrowser for help on using the repository browser.