Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 634

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

18.07.2015, 23:31. Показов 2944. Ответов 34
Метки нет (Все метки)

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

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

Синтаксический анализатор кода простой программы
Здравствуйте! Я начала изучать с# недавно, поэтому мне нужна помощь. Прошу у вас помощи в составлении синтаксического анализатора кода...

Простейший анализатор текста
Добрый вечер, помогите пожалуйста с программой заранее благодарен. нужна программа которая может произвести анализ введенного в окно...

простейший синтаксический анализатор(Распознавание числа)
Это задание является подзаданием для курсовой по формальным языкам. Мне надо(пока что только это) чтобы моя программа распознавала...

34
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 634
19.07.2015, 10:21  [ТС]
Чуток подправил код... Теперь показывает средневзвешенную погрешность измерений....
Вложения
Тип файла: rar prjPerfomance.rar (35.0 Кб, 20 просмотров)
1
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
19.07.2015, 11:23
Только у меня в ошибку вылетает? Что то с памятью моей стало...
0
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 634
19.07.2015, 11:53  [ТС]
Так. Интересно..., а экзешник тоже вылетает?
Возможно дело в SP6 for VB 6.0
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
19.07.2015, 12:44
Цитата Сообщение от kreotodr Посмотреть сообщение
а экзешник тоже вылетает?
Ну да, то же самое, Overflow
0
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 634
19.07.2015, 13:04  [ТС]
Странн. Проверил на трех машинах. Везде ок. WinXP Windows 7 Windows 10.

Добавлено через 59 секунд
Попробуй long или double
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
19.07.2015, 13:08
kreotodr, у меня экзешник не работает: при запуске из Проводника на мгновение появляются песочные часы, и все. Лог-файл не образуется. VB6 не установлен.
WinXP SP3 English
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
19.07.2015, 13:23
Вообще не понимаю, почему работает?
По определению:
Currency - создан для того, чтобы избежать ошибок при преобразовании десятичных чисел в двоичную форму и наоборот. (Невозможно 1/10 представить как сумму 1/2,1/4, 1/8, 1/16 и т.п.) Данный тип может иметь до 4 цифр после запятой, и до 14 - перед ней.

Какое то время до 5 сек. работает с Single. Потом всё равно переполнение.
0
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 634
19.07.2015, 14:39  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Вообще не понимаю, почему работает?
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
19.07.2015, 14:49
Не нужно умножать на 10000 при конвертации в large-integer. Ошибка зависит от того как долго включён компьютер.

Добавлено через 2 минуты
Вообще не понимаю, почему собойает?
Потому что currency представляет собой аналог 64 бииного знакового числа, только деленного на 10000.
0
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 634
19.07.2015, 15:09  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Ошибка зависит от того как долго включён компьютер.
Анатолий думаю что ты как всегда прав... Однако:

1. Запустил интереса ради на серваке дома (работа после рестарта 11 часов).. Полет нормальный... ))))
2. Запустил на рабочем компе (последний рестарт 17/17/15) Полет нормальный... ))))
3. Запустил на рабочем серваке (рестарт 11/07/15) полет тоже нормальный...

Добавлено через 12 минут

0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
19.07.2015, 15:50
kreotodr, у меня на другом компе тоже с WinXP SP3, но с установленным VB6 заработало.
Могу добавить, что:
1. Функциям счетчика можно непосредственно передавать переменные типа Currency, можно обойтись без типа LARGE_INTEGER.
2. Если измеряемое время составляет более ~0,1 с, то использование API функций не имеет никакого преимущества перед обычной функцией Timer.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Option Explicit
 
Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Currency) As Long
Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As Currency) As Long
 
Private Sub Form_Load()
Dim cuFrequency     As Currency
Dim cuStart         As Currency
Dim cuStop          As Currency
Dim sngStart As Single, sngStop As Single
Dim dblT As Double, dblTd As Double
If QueryPerformanceFrequency(cuFrequency) = 0 Then
  MsgBox "Счетчик не работает", vbCritical
Else
  sngStart = Timer
  QueryPerformanceCounter cuStart
  For dblT = 1 To 50000
              dblTd = ((Sin(dblT) ^ 2) * 1.25666 + Cos((dblT / 1.2563 / Tan(1.25688))) + _
              (Sin(dblT) ^ 2) * 1.25666 + Cos((dblT / 1.2563 / Tan(1.25688))) + (Sin(dblT) ^ 2) * _
              1.25666 + Cos((dblT / 1.2563 / Tan(1.25688))) + (Sin(dblT) ^ 2) * 1.25666 + _
              Cos((dblT / 1.2563 / Tan(1.25688))) + (Sin(dblT) ^ 2) * 1.25666 + Cos((dblT / 1.2563 / Tan(1.25688))) + _
              (Sin(dblT) ^ 2) * 1.25666 + Cos((dblT / 1.2563 / Tan(1.25688)))) / 12.1212154545455 + Tan(dblT) + _
              Log(5.25665 * 56.25665)
  Next
  QueryPerformanceCounter cuStop
  sngStop = Timer
  MsgBox "Время по счетчику " & (cuStop - cuStart) / cuFrequency & vbLf & _
    "Время по таймеру " & sngStop - sngStart
End If
End
End Sub
В данном случае у меня результаты 0,284 и 0,281.
0
19.07.2015, 15:53

Не по теме:

Цитата Сообщение от kreotodr Посмотреть сообщение
последний рестарт 17/17/15)
Живут же люди! А сколько всего у вас месяцев в году?

0
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 634
20.07.2015, 09:51  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
последний рестарт 17/17/15)
описька 17/07/15

Добавлено через 1 минуту
Цитата Сообщение от Казанский Посмотреть сообщение
ь без типа LARGE_INTEGER.
В целом, я предложил идею....Допиливать можно де бесконечности....
Кстати с "Тимером" погрешность смотрели? Например 100 циклов... Не +- 30%?
Счетчик дает погрешность от 0 до 5%...

Добавлено через 17 часов 33 минуты
Да.... не покритиковали....и не похвалили ))))
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
20.07.2015, 10:53
Цитата Сообщение от kreotodr Посмотреть сообщение
Да.... не покритиковали....и не похвалили
Неинтересно
0
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 634
23.07.2015, 08:58  [ТС]
Цитата Сообщение от SoftIce Посмотреть сообщение
Неинтересно
Ну такое дело...
Я тепрь постоянно "смотрю" где код тормозит....Удобно
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
23.07.2015, 12:53
Цитата Сообщение от kreotodr Посмотреть сообщение
Задался целью выяснить почему программа, которую я написал тормозит, точнеее какие ее блоки...
И как... достигли первоначальной цели?
Интересно было бы услышать от Вас сам механизм поиска притормаживающего блока (порядок Ваших действий).
0
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 634
23.07.2015, 14:11  [ТС]
Хм. Не уверен, что понял Вас.
В целом да...

Старт....

Код

Энд. ..
Результат.
Раздвигаю зону исследования. . Результат.
..сужаю зону. Пока не найду где "затор"

У себя нашел участок кода где были "провалы" до 0.8 сек. После оптимизации стало 0.15
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
23.07.2015, 20:13
Лучший ответ Сообщение было отмечено kreotodr как решение

Решение

Ясно. У меня другая ситуация. Относительно немалый проект. Множество функций. Множество компов с самыми различными конфигурациями и ПО.
Есть вероятность, что в некоторых случаях в каких-то из функций возникает задержка порядка нескольких секунд.
Возможностей повторить эксперимент с проблемным ПК иногда не бывает. Но программа всегда выдает отчет.
Мое решение: в начало и конец каждой функции помещаю вызов функции логирования времени + еще кое-какой полезной инфы.
Чтобы не засорять код, все лишнее помещаю под блоки условной компиляции.
Релизный EXE компилируется без этих блоков. Отладочный с ними.
Как то в одной из функций использовал DeviceIoControl. Выяснилось, что один из антивирусов блокировал на 20 секунд работу программы из-за нее.
1
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 634
27.07.2015, 16:37  [ТС]
Цитата Сообщение от Dragokas Посмотреть сообщение
Мое решение: в начало и конец каждой функции помещаю вызов функции логирования времени + еще кое-какой полезной инфы.
Чтобы не засорять код, все лишнее помещаю под блоки усло
Поделитесь, если не жаль.. Можно в личку...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.07.2015, 16:37
Помогаю со студенческими работами здесь

Анализатор С++ кода
Доброго времени суток. Задача - разработать анализатор исходного кода на языках С++ с выявлением ошибок оформления (отступы пробелы,...

Анализатор кода
Есть исходный файл (код C++) программы. Нужно создать дамп с анализом его содержимого. Например: #include &lt;iostream&gt; void...

Будет ли разница в производительности программы на C++ и такой же программы на С
Вот стало интересно, будет ли разница в производительности программы на С++ и такой же программы на С? Например, написали программу,...

Оценка производительности системы
Здравствуйте! Мой компьютер Phenom II X4 965 (3.4 GHz), 4GB, GTX550 Ti (1024), 1Tb, DVD±RW, CR. Установлено: Win XP и Win 7 Вопрос:...

Простейший пример операционной системы
Приветствую всех. Заинтересовался устройством операционных систем и захотел попробовать написать собственную. Разумеется, не серьезную, а...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru