Простейший анализатор производительности системы (кода программы) - VB

Узнай цену своей работы

Формулировка задачи:

Всем привет! Задался целью выяснить почему программа, которую я написал тормозит, точнеее какие ее блоки... Может кому пригодится, простой анализатор скорости работы кода. Выдает действительный результата три знака после запятой. Погрешность измериний не большая. Втулил интерфейс аля Win10, тени от формы (корректно и быстро отрисовываюстя), перетаскивание формы...

код формы

Листинг программы
  1. Option Explicit
  2. Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As LARGE_INTEGER) As Long
  3. Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As LARGE_INTEGER) As Long
  4. Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
  5. Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
  6. Private Declare Function ReleaseCapture Lib "user32" () As Long
  7. Private Type LARGE_INTEGER
  8. LowPart As Long
  9. HighPart As Long
  10. End Type
  11. Const WM_NCLBUTTONDOWN = &HA1
  12. Const HTCAPTION = 2
  13. Dim Shadow As clsShadow
  14. Private Sub Command1_Click()
  15. Dim intK As Integer
  16. Dim dblT As Double
  17. Dim liFrequency As LARGE_INTEGER
  18. Dim liStart As LARGE_INTEGER, liStop As LARGE_INTEGER
  19. Dim cuFrequency As Currency
  20. Dim cuStart As Currency
  21. Dim cuStop As Currency
  22. Dim dblTd As Double
  23. Dim dblTmax(1000) As Double
  24. Dim dblSum As Double
  25. Dim intFreeNoom As Integer
  26.  
  27. intFreeNoom = FreeFile
  28. Open App.Path & "\PerfCount.log" For Append As #intFreeNoom ' лог файл
  29. Print #intFreeNoom, ""
  30. Print #intFreeNoom, "Date - "; Date
  31. Print #intFreeNoom, "Time - "; Time
  32. Print #intFreeNoom, ""
  33.  
  34. If QueryPerformanceFrequency(liFrequency) <> 0 Then
  35. List1.Clear
  36. List1.AddItem ""
  37. List1.AddItem "Please do not touch the mouse and "
  38. List1.AddItem "keyboard while the test begin!"
  39. List1.AddItem ""
  40. List1.AddItem "============== Test Begin ================"
  41. List1.AddItem ""
  42. Print #intFreeNoom, ""
  43. Print #intFreeNoom, "============== Test Begin ================"
  44. Print #intFreeNoom, ""
  45. For intK = 0 To Val(Text2)
  46. cuFrequency = LargeIntToCurrency(liFrequency)
  47. QueryPerformanceCounter liStart
  48. '
  49. ' Любое арифмитеческое выражение или код вашей программы
  50. '
  51. For dblT = 0 To Val(Text1)
  52. dblTd = ((Sin(dblT) ^ 2) * 1.25666 + Cos((dblT / 1.2563 / Tan(1.25688))) + _
  53. (Sin(dblT) ^ 2) * 1.25666 + Cos((dblT / 1.2563 / Tan(1.25688))) + (Sin(dblT) ^ 2) * _
  54. 1.25666 + Cos((dblT / 1.2563 / Tan(1.25688))) + (Sin(dblT) ^ 2) * 1.25666 + _
  55. Cos((dblT / 1.2563 / Tan(1.25688))) + (Sin(dblT) ^ 2) * 1.25666 + Cos((dblT / 1.2563 / Tan(1.25688))) + _
  56. (Sin(dblT) ^ 2) * 1.25666 + Cos((dblT / 1.2563 / Tan(1.25688)))) / 12.1212154545455 + Tan(dblT) + _
  57. Log(5.25665 * 56.25665)
  58. DoEvents
  59. Next
  60. '
  61. ' Любое арифмитеческое выражение или код вашей программы
  62. '
  63. QueryPerformanceCounter liStop
  64. cuStart = LargeIntToCurrency(liStart)
  65. cuStop = LargeIntToCurrency(liStop)
  66. List1.AddItem " Count " & Format(intK + 1, "0#") & " Time: " & Format((((cuStop - cuStart) / cuFrequency)), "0.000") & " seconds"
  67. Print #intFreeNoom, " Count " & Format(intK + 1, "0#") & " Time: " & Format((((cuStop - cuStart) / cuFrequency)), "0.000") & " seconds"
  68. dblTmax(intK) = CStr((cuStop - cuStart) / cuFrequency)
  69. Next
  70.  
  71. For intK = 0 To Val(Text2)
  72. dblSum = dblSum + dblTmax(intK)
  73. Next
  74. List1.AddItem ""
  75. List1.AddItem "=============== Test End =================="
  76. List1.AddItem ""
  77. List1.AddItem " Averge Time: " + Format(dblSum / (Val(Text2) + 1), "0.0000") & " seconds"
  78. List1.AddItem ""
  79. List1.AddItem " my CoreI5@4200MHz: " & "1.072 sec. P-Code"
  80. List1.AddItem " my CoreI5@4200MHz: " & "0.902 sec. FastCode"
  81. Print #intFreeNoom, ""
  82. Print #intFreeNoom, "=============== Test End =================="
  83. Print #intFreeNoom, ""
  84. Print #intFreeNoom, " Averge Time: " + Format(dblSum / (Val(Text2) + 1), "0.0000") & " seconds"
  85. Close #intFreeNoom
  86.  
  87. End If
  88. End Sub
  89. Private Sub Command2_Click()
  90. Set Shadow = Nothing
  91. Unload frmPerfomance
  92. End
  93. End Sub
  94. Private Function LargeIntToCurrency(liInput As LARGE_INTEGER) As Currency
  95. CopyMemory LargeIntToCurrency, liInput, LenB(liInput)
  96. LargeIntToCurrency = LargeIntToCurrency * 10000
  97. End Function
  98. Private Sub Form_Load()
  99. '
  100. ' установка тени от формы
  101. '
  102. ' Shadow.Depth - размер
  103. ' Shadow.Transparency - прозрачность
  104. '
  105. Set Shadow = New clsShadow
  106. Call Shadow.Shadow(Me)
  107. Shadow.Depth = 12
  108. Shadow.Transparency = 110
  109. End Sub
  110. Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  111. '
  112. ' перетаскивание за форму
  113. '
  114. ReleaseCapture
  115. SendMessage Me.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0
  116. End Sub
  117. Private Sub List1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  118. ReleaseCapture
  119. SendMessage Me.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0
  120. End Sub

Решение задачи: «Простейший анализатор производительности системы (кода программы)»

textual
Листинг программы
  1. Option Explicit
  2.  
  3. Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Currency) As Long
  4. Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As Currency) As Long
  5.  
  6. Private Sub Form_Load()
  7. Dim cuFrequency     As Currency
  8. Dim cuStart         As Currency
  9. Dim cuStop          As Currency
  10. Dim sngStart As Single, sngStop As Single
  11. Dim dblT As Double, dblTd As Double
  12. If QueryPerformanceFrequency(cuFrequency) = 0 Then
  13.   MsgBox "Счетчик не работает", vbCritical
  14. Else
  15.   sngStart = Timer
  16.   QueryPerformanceCounter cuStart
  17.   For dblT = 1 To 50000
  18.               dblTd = ((Sin(dblT) ^ 2) * 1.25666 + Cos((dblT / 1.2563 / Tan(1.25688))) + _
  19.               (Sin(dblT) ^ 2) * 1.25666 + Cos((dblT / 1.2563 / Tan(1.25688))) + (Sin(dblT) ^ 2) * _
  20.               1.25666 + Cos((dblT / 1.2563 / Tan(1.25688))) + (Sin(dblT) ^ 2) * 1.25666 + _
  21.               Cos((dblT / 1.2563 / Tan(1.25688))) + (Sin(dblT) ^ 2) * 1.25666 + Cos((dblT / 1.2563 / Tan(1.25688))) + _
  22.               (Sin(dblT) ^ 2) * 1.25666 + Cos((dblT / 1.2563 / Tan(1.25688)))) / 12.1212154545455 + Tan(dblT) + _
  23.               Log(5.25665 * 56.25665)
  24.   Next
  25.   QueryPerformanceCounter cuStop
  26.   sngStop = Timer
  27.   MsgBox "Время по счетчику " & (cuStop - cuStart) / cuFrequency & vbLf & _
  28.     "Время по таймеру " & sngStop - sngStart
  29. End If
  30. End
  31. End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы