/Misc/tsc_stats_test.py

http://unladen-swallow.googlecode.com/ · Python · 131 lines · 111 code · 15 blank · 5 comment · 1 complexity · c2691677486ecb612aaa5be617c3a0b3 MD5 · raw file

  1. #!/usr/bin/env python
  2. from __future__ import with_statement
  3. import StringIO
  4. import unittest
  5. import warnings
  6. import tsc_stats
  7. class TscStatsTest(unittest.TestCase):
  8. def testMedianOdd(self):
  9. # Note: median requires that its input be sorted.
  10. xs = [1, 2, 3, 4, 5]
  11. self.assertEqual(tsc_stats.median(xs), 3)
  12. def testMedianEven(self):
  13. # Note: median requires that its input be sorted.
  14. xs = [1, 2, 3, 4, 5, 6]
  15. self.assertAlmostEqual(tsc_stats.median(xs), 3.5, 0.01)
  16. def testMean(self):
  17. xs = [1, 2, 3]
  18. self.assertAlmostEqual(tsc_stats.mean(xs), 2.0, 0.01)
  19. def testStdDevNoVariance(self):
  20. xs = [2, 2, 2]
  21. self.assertAlmostEqual(tsc_stats.stddev(xs), 0, 0.01)
  22. def testStdDev(self):
  23. xs = [1, 2, 3]
  24. expected = (1 + 0 + 1) / 2
  25. self.assertAlmostEqual(tsc_stats.stddev(xs), expected, 0.01)
  26. def testAnalyzerSimpleCalls(self):
  27. input = StringIO.StringIO("""\
  28. 0 CALL_START_EVAL 42602597860025
  29. 0 CALL_ENTER_C 42602597871713
  30. 0 CALL_START_EVAL 42602597880984
  31. 0 CALL_ENTER_PYOBJ_CALL 42602597883307
  32. 0 CALL_START_EVAL 42602597894126
  33. 0 CALL_ENTER_EVAL 42602597898375
  34. 0 CALL_START_EVAL 42602597902292
  35. 0 CALL_ENTER_C 42602597902916
  36. 0 LOAD_GLOBAL_ENTER_EVAL 42602633110000
  37. 0 LOAD_GLOBAL_EXIT_EVAL 42602633111000
  38. """)
  39. analyzer = tsc_stats.TimeAnalyzer(input)
  40. analyzer.analyze()
  41. call_delta_dict = {
  42. ('CALL_START_EVAL', 'CALL_ENTER_C'):
  43. [42602597871713 - 42602597860025,
  44. 42602597902916 - 42602597902292],
  45. ('CALL_START_EVAL', 'CALL_ENTER_PYOBJ_CALL'):
  46. [42602597883307 - 42602597880984],
  47. ('CALL_START_EVAL', 'CALL_ENTER_EVAL'):
  48. [42602597898375 - 42602597894126],
  49. }
  50. global_delta_dict = {
  51. ('LOAD_GLOBAL_ENTER_EVAL', 'LOAD_GLOBAL_EXIT_EVAL'):
  52. [1000],
  53. }
  54. self.assertEqual(analyzer.call_stats.delta_dict, call_delta_dict)
  55. self.assertEqual(analyzer.global_stats.delta_dict, global_delta_dict)
  56. def testAnalyzerJittedCall(self):
  57. input = StringIO.StringIO("""\
  58. 0 CALL_START_EVAL 0
  59. 0 EVAL_COMPILE_START 10
  60. 0 LLVM_COMPILE_START 15
  61. 0 LLVM_COMPILE_END 35
  62. 0 JIT_START 40
  63. 0 JIT_END 95
  64. 0 EVAL_COMPILE_END 100
  65. 0 CALL_ENTER_LLVM 200
  66. 0 CALL_START_LLVM 300
  67. 0 CALL_ENTER_EVAL 400
  68. """)
  69. analyzer = tsc_stats.TimeAnalyzer(input)
  70. analyzer.analyze()
  71. eval_compile_time = 90
  72. call_delta_dict = {
  73. ('CALL_START_EVAL', 'CALL_ENTER_LLVM'):
  74. [200 - eval_compile_time],
  75. ('CALL_START_LLVM', 'CALL_ENTER_EVAL'):
  76. [100],
  77. }
  78. self.assertEqual(analyzer.call_stats.delta_dict, call_delta_dict)
  79. self.assertEqual(analyzer.llvm_stats.aggregate_deltas, [20])
  80. self.assertEqual(analyzer.native_stats.aggregate_deltas, [55])
  81. self.assertEqual(analyzer.eval_compile_stats.aggregate_deltas,
  82. [eval_compile_time])
  83. def testAnalyzerFlushFudge(self):
  84. input = StringIO.StringIO("""\
  85. 0 CALL_START_EVAL 0
  86. 0 EVAL_COMPILE_START 10
  87. 0 LLVM_COMPILE_START 15
  88. 0 LLVM_COMPILE_END 35
  89. 0 JIT_START 40
  90. 0 FLUSH_START 41
  91. 0 FLUSH_END 20041
  92. 0 JIT_END 20095
  93. 0 EVAL_COMPILE_END 20100
  94. 0 CALL_ENTER_LLVM 20200
  95. 0 CALL_START_LLVM 20300
  96. 0 CALL_ENTER_EVAL 20400
  97. """)
  98. analyzer = tsc_stats.TimeAnalyzer(input)
  99. analyzer.analyze()
  100. eval_compile_time = 90
  101. flush_time = 20000
  102. call_delta_dict = {
  103. ('CALL_START_EVAL', 'CALL_ENTER_LLVM'): [200 - eval_compile_time],
  104. ('CALL_START_LLVM', 'CALL_ENTER_EVAL'): [100],
  105. }
  106. self.assertEqual(analyzer.call_stats.delta_dict, call_delta_dict)
  107. self.assertEqual(analyzer.flush_stats.aggregate_deltas, [20000])
  108. self.assertEqual(analyzer.llvm_stats.aggregate_deltas, [20])
  109. self.assertEqual(analyzer.native_stats.aggregate_deltas, [55])
  110. self.assertEqual(analyzer.eval_compile_stats.aggregate_deltas,
  111. [eval_compile_time])
  112. if __name__ == '__main__':
  113. # Silence a warning from the unittest module relating to floating point
  114. # equality. We're doing the right thing, but it doesn't in Python 2.5.
  115. warnings.filterwarnings('ignore', '.*integer.*float.*')
  116. unittest.main()