Господа!
Как я понял дело в тормознутом управлении памяти под Win98.
Достаточно было переделать и перейти от стркутуры к классу (вместо Type TOneRecord -> TOneRecord.cls) как все залетало
Win98 — SUXXX
... << RSDN@Home 1.0 beta 7a >>
Здравствуйте, dimzon, Вы писали:
Посмотри здесь
Изобретение велосипеда можно оставить на потом
http://www.vbbyjc.com/
VB 6 Projects and Articles ->
Polymorphic Sorting and Searching
Господа, помогите пожалуйста. Проблема с сортировкой большого массива данных (27000 элементов). Код см. ниже.
По Win2k работает 10-15 секунд
Под Win98 на той-же машине(вернее из под WMWare) > 15 минут.
Почему такая офигенная разница? Как добиться чтобы под win98 выполнялось хотя-бы за 5 минут?
Private Type TOneRecord
Koduch As String
Nameu As String
Numh As String
Numk As String
Numf As String
Famr As String
Namer As String
Otchr As String
Dataro As String
Division As String
End Type
'.....
Private m_aData() As TOneRecord
'.....
' Возвращает True если a<b
Private Function CompareRecords(ByRef a As TOneRecord, ByRef b As TOneRecord) As Boolean
' If g_bByDistrict Then
' strSelect = strSelect & " ORDER BY Koduch, Famr, Namer, Otchr"
' Else
' strSelect = strSelect & " ORDER BY Famr, Namer, Otchr"
' End If
Dim nRes As Long
CompareRecords = True
If m_bByDistrict Then
nRes = StrComp(a.Koduch, b.Koduch, vbTextCompare)
If -1 = nRes Then
Exit Function
ElseIf 1 = nRes Then
CompareRecords = False
Exit Function
End If
End If
nRes = StrComp(a.Famr, b.Famr, vbTextCompare)
If -1 = nRes Then
Exit Function
ElseIf 1 = nRes Then
CompareRecords = False
Exit Function
End If
nRes = StrComp(a.Namer, b.Namer, vbTextCompare)
If -1 = nRes Then
Exit Function
ElseIf 1 = nRes Then
CompareRecords = False
Exit Function
End If
nRes = StrComp(a.Otchr, b.Otchr, vbTextCompare)
If -1 = nRes Then
Exit Function
ElseIf 1 = nRes Then
CompareRecords = False
Exit Function
End If
CompareRecords = False
End Function
'.....
' Алгоритм быстрой сортировки
Private Sub QuickSort(ByRef item() As TOneRecord, left As Long, right As Long)
Dim i As Long, j As Long
Dim x As TOneRecord
Dim center As TOneRecord
i = left
j = right
center = item(Fix((left + right) / 2))
Do While i <= j
Do While CompareRecords(item(i), center) And (i < right)
i = i + 1
Loop
Do While CompareRecords(center, item(j)) And (j > left)
j = j - 1
Loop
If i <= j Then
x = item(i)
item(i) = item(j)
item(j) = x
i = i + 1
j = j - 1
End If
Loop
If left < j Then QuickSort item, left, j
If right > i Then QuickSort item, i, right
End Sub
... << RSDN@Home 1.0 beta 7a >>
Здравствуйте, dimzon, Вы писали:
D>Господа, помогите пожалуйста. Проблема с сортировкой большого массива данных (27000 элементов). Код см. ниже.
D>По Win2k работает 10-15 секунд
D>Под Win98 на той-же машине(вернее из под WMWare) > 15 минут.
D>Почему такая офигенная разница? Как добиться чтобы под win98 выполнялось хотя-бы за 5 минут?
D>
Среди меня есть мнение что это из-за разного использования стека под 98 и 2k (QuickSort то рекурсивный). Попробуй сэмулировать это дело програмно как тут
http://algolist.manual.ru/sort/quick_sort.php.
Здравствуйте, dimzon, Вы писали:
D>На самом деле не факт... Дело в том что все классы в VB работают через механизм COM-объектов, что не очень быстро. Я рассчитывал что обращения к полям UDT будет быстрее чем к свойствам класса (и оно наверно так и есть), но проиграл по объемам памяти пересылаемым туда-сюда при сортировке...
А вот с UDT в VB известная трабла, что каст в вариант (добавление в Collection) и персистансе работают только если он был обьявлен в публичном модуле, отсюда куча гемора с использованием. Я лично от UDT давно отказался — всё в классах.....
>А перед UDT я пытался использовать вообще вариантный массив — было исчо медленнее
Ну дык каст в вариант и обратно....
Короче это не Win98, а UDT suxx
Здравствуйте, BugMan, Вы писали:
BM>Здравствуйте, dimzon, Вы писали:
D>На самом деле не факт... Дело в том что все классы в VB работают через механизм COM-объектов, что не очень быстро. Я рассчитывал что обращения к полям UDT будет быстрее чем к свойствам класса (и оно наверно так и есть), но проиграл по объемам памяти пересылаемым туда-сюда при сортировке...
BM>А вот с UDT в VB известная трабла, что каст в вариант (добавление в Collection) и персистансе работают только если он был обьявлен в публичном модуле, отсюда куча гемора с использованием. Я лично от UDT давно отказался — всё в классах.....
Теперь я тоже все буду в классах делать.
... << RSDN@Home 1.0 beta 7a >>
Здравствуйте, Аноним, Вы писали:
А>http://www.vbbyjc.com/
Прикольный сайтик, спасибки....
Хотя таймер, колекшены и сабклассинг у меня лучше сделаны