Помогите оптимизировать код программы

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
DeQuick
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 24.11.2008 (Пн) 0:26

Помогите оптимизировать код программы

Сообщение DeQuick » 24.11.2008 (Пн) 0:34

"Целочисленный одномерный массив из N элементов заполнить с кла-ры. Все максимальные элементы перенести в конец массива, а остальные элементы сдвинуть влево, сохраняя их относительное расположение. Пример: 8 3 2 8 7 1 2 8 0 -> 3 2 7 1 2 0 8 8 8.

Код: Выделить всё
Option Explicit
Private Sub Command1_Click()

Const N = 9
Dim A(1 To N) As Integer, i As Byte, j As Byte, s As Byte
Dim B(1 To N) As Byte, max As Long

For i = 1 To N
  A(i) = InputBox("введите " & i & "-й элемент массива", "Заполнение массива")
  lbl2.Caption = lbl2 & " " & A(i)
Next i


max = A(1)
s = 0
For i = 1 To N
  If A(i) > max Then
    max = A(i)
    s = 0
  End If
  If A(i) = max Then
    s = s + 1
    B(s) = i
  End If
Next i

For j = 1 To s
  For i = B(s - j + 1) To N - 1
      A(i) = A(i + 1)
      A(i + 1) = max
  Next i
Next j

lbl1.Caption = " "
For i = 1 To N
  lbl1.Caption = lbl1 & " " & A(i)
Next i

End Sub

[Viper] :: Пользуемся тэгами CODE!
Последний раз редактировалось DeQuick 24.11.2008 (Пн) 17:01, всего редактировалось 1 раз.

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Re: Помогите оптимизировать код программы

Сообщение Alprog » 24.11.2008 (Пн) 10:01

Можно так написать:

Код: Выделить всё
Option Explicit

Private Sub Command1_Click()
    Const N = 9
    Dim A(1 To N) As Integer, i As Integer, s As Integer, max As Integer
    For i = 1 To N
        A(i) = InputBox("введите " & i & "-й элемент массива", "Заполнение массива")
        lbl2.Caption = lbl2 & " " & A(i)
    Next i
   
    max = A(1)
    For i = 2 To N
        If A(i) > max Then max = A(i)
    Next i
   
    lbl1.Caption = " "
   
    For i = 1 To N
        If A(i) = max Then
            s = s + 1
        Else
            lbl1.Caption = lbl1 & " " & A(i)
        End If
    Next i
    For i = 1 To s
        lbl1.Caption = lbl1 & " " & max
    Next
End Sub


Переменные объявлены все как Integer.
За первый проход по массиву находим максимум, количество максимумов и их смещение нас не интересует.
За второй проход выводим сразу в лейбл все "не максимумы" и запоминаем сколько нам встретилось максимумов.
Ну и в самом конце добавляем столько максимумов, сколько нам встретилось.

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Re: Помогите оптимизировать код программы

Сообщение SSecurity » 24.11.2008 (Пн) 11:50

ну максимум можно ещё на этапе ввода вычислить :)
после очередного
Код: Выделить всё
For i = 1 To N
  A(i) = InputBox("введите " & i & "-й элемент массива", "Заполнение массива")
  if I = 1 THEN
    Max = A(1)
  else
    if Max<A(i) THEN Max = A(i)
  end if
  lbl2.Caption = lbl2 & " " & A(i)
Next i
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

DeQuick
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 24.11.2008 (Пн) 0:26

Re: Помогите оптимизировать код программы

Сообщение DeQuick » 24.11.2008 (Пн) 16:55

спасибо, работа и так зачлась. Но все равно сейчас переделаю. Кстати, как можно замерить время выполнения программы в VB6?
P.S. дааа... с типами я напутал, массив типа integer, а max - long, но в принципе, мне кажется, задача не подразумевает большое кол-во чисел в массиве.

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Re: Помогите оптимизировать код программы

Сообщение Alprog » 24.11.2008 (Пн) 18:25

мне кажется, задача не подразумевает большое кол-во чисел в массиве

Дело не в этом. На сколько я знаю, на x86-ых быстрее выполняются операции с Integer'ом.

Кстати, как можно замерить время выполнения программы в VB6?

Простой способ:

Код: Выделить всё
Dim tim as Single
tim = timer
'Делаем долгие операции
msgbox timer - tim


Правда, твоя прога маленькая, а, значит, очень быстро выполняется.
Настолько быстро, что точности функции timer не хватает, чтобы заметить разницу во времени.

Для более точной замерки нужно использовать винапи.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Помогите оптимизировать код программы

Сообщение iGrok » 24.11.2008 (Пн) 18:49

Alprog писал(а):Дело не в этом. На сколько я знаю, на x86-ых быстрее выполняются операции с Integer'ом.

Боюсь, если разница и есть, на фоне всего остального она будет незаметна.

Alprog писал(а):Для более точной замерки нужно использовать винапи.

Угу. Что-нить типа GetTickCount.
label:
cli
jmp label

Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Re: Помогите оптимизировать код программы

Сообщение Alprog » 24.11.2008 (Пн) 19:30

Боюсь, если разница и есть, на фоне всего остального она будет незаметна.

Я очень старался оптимизировать :D

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Помогите оптимизировать код программы

Сообщение SLIM » 24.11.2008 (Пн) 23:18

iGrok писал(а):Угу. Что-нить типа GetTickCount.

Ты что прикололся - использовать API для измерения времени выполнения...))))))
Пишите жизнь на чистовик.....переписать не удастся.....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Помогите оптимизировать код программы

Сообщение Хакер » 24.11.2008 (Пн) 23:19

Нет, ибо в этом нет ничего прикольного.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Помогите оптимизировать код программы

Сообщение SLIM » 24.11.2008 (Пн) 23:28

Хакер писал(а):Нет, ибо в этом нет ничего прикольного.

[offtopic]принципиально найду твой пост где и ты тоже говорил что замерять скорость с помощью API - это неправильно. А если постораться то и можно найти несколько других...[/offtopic]
Пишите жизнь на чистовик.....переписать не удастся.....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Помогите оптимизировать код программы

Сообщение Хакер » 24.11.2008 (Пн) 23:31

Найди :)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Re: Помогите оптимизировать код программы

Сообщение SSecurity » 25.11.2008 (Вт) 1:43

я думаю Timer вполне сгодится для данной программы .... или кто-то считает что найдется такой товарищ, который массив вручную будет за миллисекунды заполнять?:)))

во всяком случае можно замерить ту часть которая обработку производит ... ну а там что, - там лучше эту обработку в цикл поставить (до 100 например) и потом на 100 результат поделить, тока вот массив нужно будет запоминать - и к начальным условиям возвращать всегда - дл\ чичтоты эксперемента :)))
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Помогите оптимизировать код программы

Сообщение iGrok » 25.11.2008 (Вт) 3:07

SLIM писал(а):
iGrok писал(а):Угу. Что-нить типа GetTickCount.

Ты что прикололся - использовать API для измерения времени выполнения...))))))

А чего тут прикольного? ЗаDeclare'ить эту API - дело пары секунд. После пятого раза объявление запоминается наизусть, так что даже ни в какие справочники лезть не надо. Да и выдаёт она целые значения миллисекунд, в отличие от timer, дающего секунды "As Single". И вообще она (имхо) удобнее. )

SSecurity писал(а):во всяком случае можно замерить ту часть которая обработку производит ... ну а там что, - там лучше эту обработку в цикл поставить (до 100 например) и потом на 100 результат поделить, тока вот массив нужно будет запоминать - и к начальным условиям возвращать всегда - дл\ чичтоты эксперемента :)))

Дык и при использовании более точного API тебе придётся обработку в цикл x100, а то и x1000 ставить.
Для 9 чисел она скорей всего займёт существенно меньше мс. Соответственно, "вчистую" её скорость ты стандартыми методами не измеришь.
label:
cli
jmp label

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Re: Помогите оптимизировать код программы

Сообщение SSecurity » 25.11.2008 (Вт) 3:15

я тут сложение проверял .... на скорость выполнения ... дык вот для результатат мне пришлось 200 млн итераций сверять :)))))
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Помогите оптимизировать код программы

Сообщение SLIM » 25.11.2008 (Вт) 23:12

iGrok писал(а):А чего тут прикольного? ЗаDeclare'ить эту API - дело пары секунд. После пятого раза объявление запоминается наизусть, так что даже ни в какие справочники лезть не надо. Да и выдаёт она целые значения миллисекунд, в отличие от timer, дающего секунды "As Single". И вообще она (имхо) удобнее. )

Да дело то не в этом - само использование API схавает кучу времени. Использовать наверное разве только для сравнительного анализа то да, можно
Пишите жизнь на чистовик.....переписать не удастся.....

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Помогите оптимизировать код программы

Сообщение iGrok » 25.11.2008 (Вт) 23:28

SLIM писал(а):Да дело то не в этом - само использование API схавает кучу времени.
Чего??
Может быть, ты имеешь в виду тот факт, что API, объявленная не через tlb, а при помощи Declare, при первом вызове будет работать медленно, за счёт того, что будут дополнительно выполняться LoadLibrary и GetProcAddress?
Ну так это будет ПЕРЕД первым вызовом, и на точность измерения времени никак не повлияет.

Или ты имеешь в виду что-то другое?
label:
cli
jmp label

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Помогите оптимизировать код программы

Сообщение SLIM » 26.11.2008 (Ср) 13:45

iGrok писал(а):Может быть, ты имеешь в виду тот факт, что API, объявленная не через tlb, а при помощи Declare

Yes. Не все же tlb имеет (кстати надо наконец скачать)...
iGrok писал(а):Ну так это будет ПЕРЕД первым вызовом, и на точность измерения времени никак не повлияет.

Возможно я ошибкась гдето.... :roll:
Пишите жизнь на чистовик.....переписать не удастся.....

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Помогите оптимизировать код программы

Сообщение Mikle » 26.11.2008 (Ср) 17:27

Может кто-то удивится, но GetTickCounter работает с той же точностью, что и Timer. Для повышенной точности нужно использовать QueryPerformance.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Помогите оптимизировать код программы

Сообщение iGrok » 26.11.2008 (Ср) 18:48

Mikle писал(а):Может кто-то удивится, но GetTickCounter работает с той же точностью, что и Timer. Для повышенной точности нужно использовать QueryPerformance.
Да я в курсе уже. Просто GTC возвращает целое кол-во мс. As Long, а Timer - дробное кол-во секунд As Single. Но это уже вопрос удобства.
label:
cli
jmp label

vein
Начинающий
Начинающий
 
Сообщения: 1
Зарегистрирован: 26.11.2008 (Ср) 22:05

Re: Помогите оптимизировать код программы

Сообщение vein » 26.11.2008 (Ср) 22:19

Здавствуйте, кто может помогите пожалуйста. Программа работает полностью, но надо её оптимизировать.
так-с, задание. С клавиатуры вводится целочисленная матрица M x N. Надо вывести на экран номера столбцов, содержащих максимальное количество нулей. ( вся фишка в том что таких столбцов может быть несколько )
Вот код тут набросал:
Код: Выделить всё
Dim Am() As Integer
Dim M As Integer, N As Integer

Private Sub Command1_Click()
Dim av() As String, strAm As String
Dim i As Integer, j As Integer, k As Integer, KMAX As Integer
If Text2.Text <> "" And Text3.Text <> "" Then
  M = Val(Text2.Text) 'число строк
  N = Val(Text3.Text) 'число столбцов
  ReDim Am(M, N) ' размерность массива Am
  Picture1.Cls
  av = Split(Text1.Text) 'вводятся элементы массива Am
  KMAX = UBound(av) 'максимально возможное количество нулей в каком-либо столбце массива
   If M * N <> KMAX + 1 Then
    MsgBox ("Вы должны ввести все элементы матрицы")
     Exit Sub
   End If ' проверка правильности количества элементов массива
 
' массив av переводится в двумерный массив Am и выводится на экран
  k = 0
  For i = 0 To M - 1 'считаем по строкам
    strAm = ""
    For j = 0 To N - 1 'считаем по столбикам
      Am(i, j) = Val(av(k)) ' переводим массив av в массив Am
      strAm = strAm + "  " + Str(Am(i, j))
      k = k + 1
    Next
    Picture1.Print strAm 'вывод массива на экран
  Next
End If


End Sub

Private Sub Command2_Click()
Dim i As Integer, j As Integer, zero_count As Integer, MAX_ZEROS As Integer
Dim j_max() As Integer
ReDim j_max(N)
Dim astr As String

'вычисляем максимальное количество нулей в каком-либо столбце(ах) матрицы Am
  k = 0
  MAX_ZEROS = 0
  For j = 0 To N - 1 'считаем по строкам
    zero_count = 0
    For i = 0 To M - 1 'считаем по столбикам
      If Am(i, j) = 0 Then
        zero_count = zero_count + 1 'считаем количество нулей в столбиках
      End If
      If MAX_ZEROS < zero_count Then
        MAX_ZEROS = zero_count 'находим максимальное число нулей в каком-то столбике
        End If
    Next
  Next
  Label3.Caption = astr
 

k = 0
  For j = 0 To N - 1 'считаем по столбикам
    zero_count = 0
   For i = 0 To M - 1 'считаем по строкам
     If Am(i, j) = 0 Then
       zero_count = zero_count + 1
     End If
    If MAX_ZEROS = zero_count Then
     j_max(k) = j + 1
      k = k + 1
      Exit For
    End If
  Next
  Next
  For k = 0 To M
    If j_max(k) <> 0 Then
    astr = astr + "  " + Str(j_max(k))
    End If
  Next
   
  Label3.Caption = astr

End Sub

всем заранее благодарен :-)
P.S. в принципе нужно оптимизировать последнюю часть кода, там где заполняется j_max() и выводится на экран, может его можно как-нибудь засунуть в циклы которые стоят выше его( в коде) ?

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Re: Помогите оптимизировать код программы

Сообщение SSecurity » 26.11.2008 (Ср) 22:40

:))) вывод в пикчербокс - это круто:)

как и в прежнем варианте - максимум нулей можно считать на этапе ввода информации :)
потом можно к примеру завести переменную текстовую в котороую сразу на этапе ввода параллельно со подсчетами записывать через запятую сколько нулей в строке / столбце (если нужно)

а потом просто разбить полученную переменную в массив
и индексы со значением равным максимальному будут соответсвовать номерам строк - т.е. то что нужно:)

Вообщем получается так:
Цикл 1 - от 0 до размерности av (одномерный).
Формирует матрицу (элементарные формулы перевода в строку/столбец).
тутже, можно считать количество нулей в строке (тогда сразу лучше создать одномерный массив xSize, размерностью в количество строк матрицы)
и тутже, можно считать максимум нулей по всем строкам
Цикл 2. Одномерный - проходит по циклу xSize и выводит индекс строк со значением равным максимуму
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 58

    TopList