Ускорить код?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Ускорить код?

Сообщение Matew » 19.12.2005 (Пн) 9:29

Это как-то можно ускорить? Сам уже старался, как мог.
Код: Выделить всё
Private Const SmallNumber As Double = 1E-70
Private Const PiNumber As Double = 3.14159265358979

Private Sub Decart(ByRef x As Single, ByRef y As Single, ugol As Double, XCentrKoor As Single, YCentrKoor As Single, mast As Single)
Dim fi As Single
Dim l As Single
    fi = Atn2(x, y) ' перевод в полярные коорд угол
    fi = fi + ugol
    l = Sqr(Square(x) + Square(y))   ' перевод в полярные коорд вектор
    l = l * mast
    x = l * Sin(fi) + XCentrKoor  ' перевод в декартовы +расположение кривой(центр осей)
    y = l * Cos(fi) + YCentrKoor  ' перевод в декартовы +расположение кривой
End Sub
Public Function Atn2(ByVal y As Double, ByVal x As Double) As Double
    If SmallNumber * Abs(y) < Abs(x) Then
        If x < 0 Then
            If y = 0 Then
                Atn2 = Pi()
            Else
                Atn2 = Atn(y / x) + Pi() * Sgn(y)
            End If
        Else
            Atn2 = Atn(y / x)
        End If
    Else
        Atn2 = Sgn(y) * Pi() / 2
    End If
End Function
Public Function Square(ByVal x As Single) As Double
    Square = x * x
End Function
Public Function Pi() As Double
    Pi = PiNumber
End Function
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 19.12.2005 (Пн) 12:03

Особо разбираться лень, но, навскидку, если уж ставишь целью ускорить работу программы, не вызывай лишние функции (Square, Pi). Кроме того, вместо вычисления арктангенса в процессе работы программы, можно заранее вычислить его значения для определенного числа точек, занести в массив, и возвращать сразу значение элемента массива, наиболее близкого к y/x. Точность вычислений понижается, но скорость возрастает.

Потом, это уже мелочи, конечно, но строки

fi = Atn2(x, y) ' перевод в полярные коорд угол
fi = fi + ugol

легко оптимизируются до

fi = Atn2(x, y)+ugol
Быть... или не быть. Вот. В чём вопрос?

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 19.12.2005 (Пн) 16:07

1.С пи я понял-у самого были сомнения.
2.А как искать по массиву самое близкое значение, если я составлю массивы ATN, Sin и Cos? Перебором же будет медленно?
3.А я читал, что
fi = Atn2(x, y) ' перевод в полярные коорд угол
fi = fi + ugol
быстрее, чем
fi = Atn2(x, y)+ugol
Это не так?
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.12.2005 (Пн) 17:20

Matew писал(а):3.А я читал, что
fi = Atn2(x, y) ' перевод в полярные коорд угол
fi = fi + ugol
быстрее, чем
fi = Atn2(x, y)+ugol
Это не так?

Это где ты такое вычитал?
Lasciate ogni speranza, voi ch'entrate.

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 19.12.2005 (Пн) 18:04

Про близкие значения: создаешь, допустим, таблицу синусов всех углов от 0 до 359 градусов с шагом в один градус. Дальше, чтобы вычислить синус x, округляешь x до целого числа градусов и берешь значение из соответствующей ячейки таблицы. Быстрее, хотя и с меньшей точностью, будет работать, если разобьешь круг на 256 равных частей.
Быть... или не быть. Вот. В чём вопрос?

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 20.12.2005 (Вт) 5:30

alibek переечитал ту статью, я был не прав.
uhm спасибо! я чет тупил. :oops:
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 22.12.2005 (Чт) 4:53

uhm писал(а):Про близкие значения: создаешь, допустим, таблицу синусов всех углов от 0 до 359 градусов с шагом в один градус. Дальше, чтобы вычислить синус x, округляешь x до целого числа градусов и берешь значение из соответствующей ячейки таблицы. Быстрее, хотя и с меньшей точностью, будет работать, если разобьешь круг на 256 равных частей.

Вот проверил-не выходит :( Мож что не так?
Вложения
test.rar
(1.31 Кб) Скачиваний: 27
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 22.12.2005 (Чт) 5:08

Если убрать вызов процедуры, то есть ускорение процентов на 30, но точность теряется сильно.
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 73

    TopList