Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 | 3 | 4 | 5 |

 

  Вопрос: АПИ в VB6 быстрее... (?) Добавлено: 31.12.06 15:13  

Автор вопроса:  -АлександР- | Web-сайт: sham.clan.su

Ответить

  Ответы Всего ответов: 74  

Номер ответа: 46
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #46
Добавлено: 02.01.07 20:22
Это просто ручки кривые, потому и глотает...
хорощо, сделай ровными, а я напишу аналог на вб6

Ответить

Номер ответа: 47
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #47 Добавлено: 02.01.07 21:12
чем тебя не устраивают для сравнения два примера в вопросе этой темы?

Чем не усраивают 2 примера??? Я бы на твоем месте на называл то, что ты написал этим громким словом-пример! И причины тому следующие:
1.Расскажи мне глубокий смысл использования тобой структуры POINTAPI? Какую роль она играет в этом примере?
2.Также не понятен глубокий смысл массива pointsArray(1) As POINTAPI! Вот скажи мне какими мыслями ты руководствовался когда создавал этот массив? Ты сначала засовываешь переменные в массив pointsArray(0).x = X : pointsArray(0).y = Y, а потому тут же, в следующе строчке достаешь их оттуда.. CreateRectRgn(pointsArray(0).x, pointsArray(0).y Ну и нафига спрашивается? Это как то ускоряет работу?
3.Тут ты получаешь цвет If GetPixel(hdc, X, Y) = 0 Then , и это значит что цвет пиксела, а равно как и его составляющих (АRGB), у тебя уже есть на руках! И вместо того, чтобы инвертировать какждую составляющую и зделать SetPixel ты а. создаешь Region величиной в ОДИН пиксел(а между тем создание Region есть очень и очень ресурсоемкая процедура) б. инвертируешь его в. освобождаешь ресурсы. Этот тоже по твоему глубокому замыслу както прибавит скорости??
И при всей кривизне твоего кода NET дает лучшие результаты (по результатм GSerg'a)
Так что, уважаемый, рановато тебе еще тестированием заниматься, и делать какие либо выводы, а тем более утверждать что либо, относительно скорости работы того или иного языка

Ответить

Номер ответа: 48
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #48 Добавлено: 02.01.07 21:37
А если тебе так хочется протестировать, то можешь попробовать этот вариант.. Подход другой, но результат то же..
О результатах тестирования сообщишь в студию..

    Private Sub Button1_Click(ByVal sender As System.Object, _
                             ByVal e As System.EventArgs) Handles Button1.Click

        Dim Start As Integer = System.Environment.TickCount

        Dim _bitmap As New Bitmap(500, 200)
        Dim _graph As Graphics = Graphics.FromImage(_bitmap)

        _graph.DrawLine(Pens.Black, 0, 0, 200, 200)
        _graph.DrawLine(Pens.Blue, 0, 0, 500, 200)

        Me.BackgroundImageLayout = ImageLayout.None
        Me.BackgroundImage = _bitmap

        Dim _recolorMap(0) As ColorMap
        _recolorMap(0) = New ColorMap
        _recolorMap(0).OldColor = Color.Black
        _recolorMap(0).NewColor = Color.White

        Dim _attributes As New ImageAttributes
        _attributes.SetRemapTable(_recolorMap)

        _graph.DrawImage(_bitmap, _
                        New Rectangle(0, 0, 500, 200), _
                         0, 0, 500, 200, _
                         GraphicsUnit.Pixel, _
                         _attributes)

        Me.BackgroundImage = _bitmap

        Start = System.Environment.TickCount - Start

        MsgBox(Start)

    End Sub

Ответить

Номер ответа: 49
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #49
Добавлено: 02.01.07 21:40
гхм, гхм, я имел в виду этот пример:
Option Explicit

Private Declare Function GetTickCount Lib "kernel32" () As Long

Private Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long

Private Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, lpPoint As POINTAPI) As Long

Private Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long

Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long

Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long

Private Type POINTAPI
        x As Long
        y As Long
End Type

Private Sub Command1_Click()
    Dim s As Long
    s = GetTickCount
     
    Dim i As Integer
    For i = 1 To 10000
        Dim d As Long
        Dim dd As Long
        Dim p As POINTAPI
        p.x = 0
        p.y = 0
         
        d = CreatePen(0, 1, 0)
        dd = SelectObject(hdc, d)
         
        MoveToEx hdc, p.x, p.y, p
        LineTo hdc, 100, 100
         
        d = SelectObject(hdc, dd)
        ;DeleteObject (d)
    Next i
     
    MsgBox GetTickCount - s
     
End Sub
и этот:
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim d As Integer = System.Environment.TickCount
        Dim f As Int32

        For f = 1 To 10000
            Dim s As System.Drawing.Graphics = Me.CreateGraphics
            s.DrawLine(Pens.Black, 0, 0, 100, 100)
            s.Dispose()
        Next f

        MsgBox(CStr(System.Environment.TickCount - d))
    End Sub
End Class
а то, о чем ты возмущаешься не принципиально, поскольку сравниваются скорость работы АПИ, которая идентична в приведенных кодах...

3.Тут ты получаешь цвет If GetPixel(hdc, X, Y) = 0 Then , и это значит что цвет пиксела, а равно как и его составляющих (АRGB), у тебя уже есть на руках! И вместо того, чтобы инвертировать какждую составляющую и зделать SetPixel ты а. создаешь Region величиной в ОДИН пиксел(а между тем создание Region есть очень и очень ресурсоемкая процедура) б. инвертируешь его в. освобождаешь ресурсы. Этот тоже по твоему глубокому замыслу както прибавит скорости??
этот код был предназначен на последовательное прохождение каждого пиусела, проверка его на цвет и если цвет = тому-то, то этот пиксел rgn-ируем, чтобы потом setwindowrgn...
но я на полпути остановился, т. к. скорость этого действа оставляла желать лучшего...
Тестировали ничего не значащий и бесполезный код.
Расскажи мне глубокий смысл
Я раскрыл тебе смысл?

Единственный смысл был в том, что в этом коде есть АПИ и он работает, а значит его можно тестить на скорость.
В тестровании на скорость не важно то, с какой это делается целью!
Важно, с какой скоростью это делается

Во всех тестированиях на скорость используются циклы. Так почему же ты не спросил, с какой целью 10000 раз повторять одно и то же действие? Без смысла

Вот и здесь не было смысла, кроме проверки скорости :)

Ответить

Номер ответа: 50
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #50 Добавлено: 02.01.07 21:48
Блин.. да при чем тут вообще АПИ??? Платформа NET принципиально не предназначена к работе с ними.. В ней и был сделан основной упор на то,чтобы избавиться от прямого вызова неуправляемого кода.. И если решить задачу нормальными ручками, а не кривыми, и не через АПИ а с помощью встроенных средств, то 6-ка будет не только пыль глотать, а дерьмо кушать!!

Ответить

Номер ответа: 51
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #51
Добавлено: 02.01.07 21:55
Блин.. да при чем тут вообще АПИ???
АПИ тут причем? Да проехали это...

где ты здесь видишь АПИ?
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim d As Integer = System.Environment.TickCount
        Dim f As Int32

        For f = 1 To 10000
            Dim s As System.Drawing.Graphics = Me.CreateGraphics
            s.DrawLine(Pens.Black, 0, 0, 100, 100)
            s.Dispose()
        Next f

        MsgBox(CStr(System.Environment.TickCount - d))
    End Sub
End Class

Ответить

Номер ответа: 52
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #52 Добавлено: 02.01.07 22:01
но я на полпути остановился, т. к. скорость этого действа оставляла желать лучшего...

А чего ты ожидал??? Мало того что ты попиксельно проходишь, так еще при каждой итерации создаешь регион и потом уничтожаешь его!!! повторяю еще раз.. Создание региона это ОЧЕНЬ ресурсоемкая операция!!! и создавать его для каждого пиксела в отдельности есть не что иное как огромная глупость.

Ответить

Номер ответа: 53
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #53
Добавлено: 02.01.07 22:07
В ВБ6 - это единственная возможность сделать окно в форме того, что на нем нарисовано, если рисунок произвольный

Ответить

Номер ответа: 54
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #54 Добавлено: 02.01.07 22:15
В ВБ6 - это единственная возможность сделать окно в форме того, что на нем нарисовано, если рисунок произвольный

А в NET это делается 1 строчкой!!! И повторяю еще раз:
НЕ НАДО ПЫТАТЬСЯ ПЕРЕНЕСТИ УРОДЛИВЫЕ РЕШЕНИЯ С 6-КИ В НЕТ!!!!
НЕТ- это абсолютно другая философия и абсолютно другой подход!

Ответить

Номер ответа: 55
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #55 Добавлено: 02.01.07 22:27
А если тебе хочется проверить скорость рисования 10000 линий, да не вопрос, легко! Только будь добр, делай это по человече,а не через одно место..

    Private Sub Button1_Click(ByVal sender As System.Object, _
                             ByVal e As System.EventArgs) Handles Button1.Click

        Dim Start As Integer = System.Environment.TickCount

        Dim _graph As Graphics = Me.CreateGraphics
        Dim _points(19999) As Point

        Dim _start, _end As Point
        _start = New Point(0, 0)
        _end = New Point(100, 100)

        For counter As Int32 = 1 To 10000 Step 2
            _points(counter) = _start
            _points(counter + 1) = _end
        Next

        _graph.DrawLines(Pens.Black, _points)
        _graph.Dispose()

        Start = System.Environment.TickCount - Start

        MsgBox(Start)

    End Sub

Ответить

Номер ответа: 56
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #56
Добавлено: 02.01.07 22:55
это получается, что линия рисуется 5000 раз?

И сколько получается?
У меня 235, впечатляет

НО

Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long

Private Sub Command1_Click()
    Dim n As Long
    n = GetTickCount
    Dim i As Integer
    For i = 1 To 10000
        Line (0, 0)-(100, 100), 0
    Next i
    MsgBox (GetTickCount - n)
End Sub
31

Ответить

Номер ответа: 57
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #57
Добавлено: 02.01.07 22:59
А в NET это делается 1 строчкой!!!
а полупрозрачность лэйбла кстати реализовать можно?

Ответить

Номер ответа: 58
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #58 Добавлено: 02.01.07 23:07
знаешь что... утомил ты меня.. забудь, все что я тебе говорил.. и пиши на шестерке.. я не собираюсь ничего тебе доказывать, и ни в чем тебя убеждать...
Удачи!

Ответить

Номер ответа: 59
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #59 Добавлено: 02.01.07 23:10
Создание региона это ОЧЕНЬ ресурсоемкая операция!!!

Не факт.

А вот InvertRgn по региону может немало времени занять.

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

Ответить

Номер ответа: 60
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #60
Добавлено: 02.01.07 23:25
знаешь что... утомил ты меня.. забудь, все что я тебе говорил.. и пиши на шестерке.. я не собираюсь ничего тебе доказывать, и ни в чем тебя убеждать...
ну, извини меня ЛАМЕРа, кстати ты с GSergом, которого я тоже видать утомил, и так сказали достаточно, чтобы склонить меня в пользу VB.Net. И на том спасибо!

А тестирование провалилось,я думаю потому что я компилил в debug... не важно короче...

Сказал бы лучше за сколько времени выполнился твой код у тебя...

Удачи!
Спасибо!
Главное трудно обучать ламера с нуля, обладя большимм знаниями и ожидать от него больщих результатов. Надеюсь, что когда я наберу опыта, мы еще с тобой пересечемся

Ответить

Страница: 1 | 2 | 3 | 4 | 5 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам