Подскажите в чем дело!
От: dimzon Россия http://dimzon541.narod.ru
Дата: 03.07.03 13:25
Оценка: 2 (1)
Господа, помогите пожалуйста. Проблема с сортировкой большого массива данных (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 >>
Re: Подскажите в чем дело!
От: BugMan  
Дата: 03.07.03 15:11
Оценка:
Здравствуйте, 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.
Re: Подскажите в чем дело!
От: dimzon Россия http://dimzon541.narod.ru
Дата: 03.07.03 15:18
Оценка: 14 (1)
Господа!

Как я понял дело в тормознутом управлении памяти под Win98.

Достаточно было переделать и перейти от стркутуры к классу (вместо Type TOneRecord -> TOneRecord.cls) как все залетало


Win98 — SUXXX
... << RSDN@Home 1.0 beta 7a >>
Re[2]: Подскажите в чем дело!
От: BugMan  
Дата: 03.07.03 15:21
Оценка:
Здравствуйте, dimzon, Вы писали:

D>Господа!


D>Как я понял дело в тормознутом управлении памяти под Win98.


D>Достаточно было переделать и перейти от стркутуры к классу (вместо Type TOneRecord -> TOneRecord.cls) как все залетало

D>
Если чесно, то я подозреваю что UDT в VB были сделаны только для совместимости с WinAPI. Воообще не советую хранить в них что-либо.....

D>Win98 — SUXXX
Re[3]: Подскажите в чем дело!
От: dimzon Россия http://dimzon541.narod.ru
Дата: 03.07.03 15:27
Оценка:
Здравствуйте, BugMan, Вы писали:

BM>Здравствуйте, dimzon, Вы писали:


D>Господа!


D>Как я понял дело в тормознутом управлении памяти под Win98.


D>Достаточно было переделать и перейти от стркутуры к классу (вместо Type TOneRecord -> TOneRecord.cls) как все залетало

D>
BM>Если чесно, то я подозреваю что UDT в VB были сделаны только для совместимости с WinAPI. Воообще не советую хранить в них что-либо.....

На самом деле не факт... Дело в том что все классы в VB работают через механизм COM-объектов, что не очень быстро. Я рассчитывал что обращения к полям UDT будет быстрее чем к свойствам класса (и оно наверно так и есть), но проиграл по объемам памяти пересылаемым туда-сюда при сортировке... А перед UDT я пытался использовать вообще вариантный массив — было исчо медленнее
... << RSDN@Home 1.0 beta 7a >>
Re[4]: Подскажите в чем дело!
От: BugMan  
Дата: 03.07.03 15:37
Оценка:
Здравствуйте, dimzon, Вы писали:

D>На самом деле не факт... Дело в том что все классы в VB работают через механизм COM-объектов, что не очень быстро. Я рассчитывал что обращения к полям UDT будет быстрее чем к свойствам класса (и оно наверно так и есть), но проиграл по объемам памяти пересылаемым туда-сюда при сортировке...

А вот с UDT в VB известная трабла, что каст в вариант (добавление в Collection) и персистансе работают только если он был обьявлен в публичном модуле, отсюда куча гемора с использованием. Я лично от UDT давно отказался — всё в классах.....

>А перед UDT я пытался использовать вообще вариантный массив — было исчо медленнее

Ну дык каст в вариант и обратно....

Короче это не Win98, а UDT suxx
Re[5]: Подскажите в чем дело!
От: dimzon Россия http://dimzon541.narod.ru
Дата: 03.07.03 15:41
Оценка:
Здравствуйте, BugMan, Вы писали:

BM>Здравствуйте, dimzon, Вы писали:


D>На самом деле не факт... Дело в том что все классы в VB работают через механизм COM-объектов, что не очень быстро. Я рассчитывал что обращения к полям UDT будет быстрее чем к свойствам класса (и оно наверно так и есть), но проиграл по объемам памяти пересылаемым туда-сюда при сортировке...

BM>А вот с UDT в VB известная трабла, что каст в вариант (добавление в Collection) и персистансе работают только если он был обьявлен в публичном модуле, отсюда куча гемора с использованием. Я лично от UDT давно отказался — всё в классах.....
Теперь я тоже все буду в классах делать.
... << RSDN@Home 1.0 beta 7a >>
Re: Подскажите в чем дело!
От: Аноним  
Дата: 03.07.03 15:50
Оценка: 6 (1)
Здравствуйте, dimzon, Вы писали:

Посмотри здесь
Изобретение велосипеда можно оставить на потом

http://www.vbbyjc.com/

VB 6 Projects and Articles ->
Polymorphic Sorting and Searching
Re[2]: Подскажите в чем дело!
От: BugMan  
Дата: 03.07.03 19:57
Оценка:
Здравствуйте, Аноним, Вы писали:


А>http://www.vbbyjc.com/

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