Быстродействие .NET

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Быстродействие .NET

Сообщение sergey-911 » 06.02.2010 (Сб) 13:33

Доброго времени суток уважаемые.
Программирую на VB.NET. среди всевозможных плюсов, которые предлагает современная среда разработки, существует существенный минус, а именно - быстродействие! Проект, написанный на VB6 работает на порядок быстрее, а то и больше. К примеру, грид из 40 000 строк раньше заполнялся менее чем за секунду. А в VB 2008 грид заполняется ровно в 10 раз медленнее. :(
Ниже приведен код, заполняющий грид C1TrueDBGrid1.
Объясните, уважаемые форумчане, я не правильно заполняю грид, или проект, написанный на .NET действительно работает медленнее?
Может нужно настройки компиляции проекта как либо изменить, и тогда будет счастье?
Ведь не может проект, написанный по новой технологии работать медленее, чем по старой?
Прошу прощения, если затронул избитую тему.
Код: Выделить всё
        Dim ConStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Sergey\Documents\Visual Studio 2008\Projects\Склад\BD\Sklad.mdb"
        Dim Con As New System.Data.OleDb.OleDbConnection
        Con.ConnectionString = ConStr
        Con.Open()
        ConStr = Con.ConnectionString
        Dim v As String = "Select * From vw_Personal"
        Dim ExecuteQuery As System.Data.Common.DbDataReader
        Dim Provider As System.Data.Common.DbProviderFactory
        Provider = System.Data.Common.DbProviderFactories.GetFactory("System.Data.OleDb")
        Using Command As System.Data.Common.DbCommand = Provider.CreateCommand()
            Command.Connection = Con
            Command.CommandText = v
            ExecuteQuery = Command.ExecuteReader()
        End Using
        Dim Reader As System.Data.OleDb.OleDbDataReader = ExecuteQuery
        Dim grid As C1.Win.C1TrueDBGrid.C1TrueDBGrid = C1TrueDBGrid1
        Dim tbl As New DataTable("Table")
        'Задержка здесь
        tbl.Load(Reader)
        Dim ds As New DataSet
        ds.Tables.Add(tbl)
        'Заполняем грид
        grid.DataSource = Nothing
        grid.DataMember = tbl.TableName
        grid.DataSource = ds
        'Очистка "SqlReader"
        Reader.Close()
        Reader = Nothing
        'Очистка "tbl"
        tbl = Nothing
        grid.visible = True
С уважением, Сергей.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Быстродействие .NET

Сообщение MIT » 06.02.2010 (Сб) 15:20

sergey-911 писал(а):Ниже приведен код, заполняющий грид C1TrueDBGrid1.
Первая мысль — выкинуть эту хренвыговоришькакоетамназвание.
Вторая - выкинуть OleDb и использовать нормальный провайдер. Чем Sql не мил?
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

zusicks438
Обычный пользователь
Обычный пользователь
 
Сообщения: 90
Зарегистрирован: 26.12.2008 (Пт) 20:16

Re: Быстродействие .NET

Сообщение zusicks438 » 06.02.2010 (Сб) 16:40

По моим наблюдениям, .NET работает медленнее, и памяти кстати занимает больше.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Быстродействие .NET

Сообщение MIT » 06.02.2010 (Сб) 17:12

Медленнее чем что? Делаю ставку на криворукость.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Быстродействие .NET

Сообщение sergey-911 » 06.02.2010 (Сб) 17:17

MIT писал(а):
sergey-911 писал(а):Ниже приведен код, заполняющий грид C1TrueDBGrid1.
Первая мысль — выкинуть эту хренвыговоришькакоетамназвание.
Вторая - выкинуть OleDb и использовать нормальный провайдер. Чем Sql не мил?

Причем здесь sql и нормальный провайдер? Использую бд Access. А C1TrueDBGrid1 - это компонент, причем весьма качественный.
С уважением, Сергей.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Быстродействие .NET

Сообщение MIT » 06.02.2010 (Сб) 18:10

sergey-911 писал(а):Причем здесь sql и нормальный провайдер?
Притом, что любой мануал по работе с базами в .NET`е скажет, что OleDb значительно медленнее чем функционал провадеров SQL. И на то есть несколько причин:
1) OleDb - это функционал COM, реализующий доступ к любой абстрактной базе данных, а универсальность всегда делается за счет чего-либо другого
2) OleDb реализует в себе огромный ворох интерфесов, по сравнению с управляемыми провайдерами .NET`а, которые легки и просты
3) OleDb работает с кучей буферов, многократно конвертирует данные (побочный эффект универсальности), в то время как используя то же самое API источника данных, управляемый провайдер сразу подготавливает данные в правильном формате

А в качестве источника можно указать что угодно, можешь не пугать меня Access`ами всякими :)

sergey-911 писал(а):А C1TrueDBGrid1 - это компонент, причем весьма качественный.
Не, ну про качество я ничего и не говорю, может он свехргениальный, но взглянуть на стандартные контролы все же советую.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Быстродействие .NET

Сообщение sergey-911 » 06.02.2010 (Сб) 19:32

MIT писал(а):
sergey-911 писал(а):Причем здесь sql и нормальный провайдер?
Притом, что любой мануал по работе с базами в .NET`е скажет, что OleDb значительно медленнее чем функционал провадеров SQL. И на то есть несколько причин:
1) OleDb - это функционал COM, реализующий доступ к любой абстрактной базе данных, а универсальность всегда делается за счет чего-либо другого
2) OleDb реализует в себе огромный ворох интерфесов, по сравнению с управляемыми провайдерами .NET`а, которые легки и просты
3) OleDb работает с кучей буферов, многократно конвертирует данные (побочный эффект универсальности), в то время как используя то же самое API источника данных, управляемый провайдер сразу подготавливает данные в правильном формате
А в качестве источника можно указать что угодно, можешь не пугать меня Access`ами всякими :)

sergey-911 писал(а):А C1TrueDBGrid1 - это компонент, причем весьма качественный.
Не, ну про качество я ничего и не говорю, может он свехргениальный, но взглянуть на стандартные контролы все же советую.





1. Пользователю не всегда удобно работать с БД sql.
2. Использую Access, в качестве БД. Проект, написанный на .NET работает гораздо медленнее, чем на VB6, хотя в качестве БД у этих 2-х проектов один и тот же файл. Поэтому тот вариант, что проект c БД sql будет работать гораздо быстрее - отпадпет. Пробовал.
3. Использование компонентов - дело вкуса, кому-тонравятся стандартные, мне коммерческие.
4. По моим наблюдениям, задержка образуется при формировании таблицы
Код: Выделить всё
tbl.Load(Reader)

, причем, при использовании, как SQL, так и Access.
С уважением, Сергей.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Быстродействие .NET

Сообщение MIT » 06.02.2010 (Сб) 19:42

sergey-911 писал(а):1. Пользователю не всегда удобно работать с БД sql.
Вопрос: ты вообще знаешь что такое sql?
sergey-911 писал(а):Использую Access, в качестве БД.
Тебе повторить, что в качестве источника можно указать что угодно?
sergey-911 писал(а):Проект, написанный на .NET работает гораздо медленнее, чем на VB6
А вот мне повторять не надо, я хоть читаю то что пишется другими участниками форума.
sergey-911 писал(а):Поэтому тот вариант, что проект c БД sql будет работать гораздо быстрее - отпадпет. Пробовал.
угу :roll:
sergey-911 писал(а):при использовании, как SQL, так и Access
Не знаю что ты понимаешь под SQL, но в обоих случаях, спорим, что ты подключался через жоOleDb?
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Быстродействие .NET

Сообщение sergey-911 » 06.02.2010 (Сб) 20:31

Mit, в споре нельзя переходить на личности.

англ. Structured Query Language — язык структурированных запросов) — универсальный компьютерный язык, применяемый для создания, модификации и управления данными в реляционных базах данных.


Какая разница, как подключаться к БД? Я вообще использую фабрику подключений.
С уважением, Сергей.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Быстродействие .NET

Сообщение MIT » 06.02.2010 (Сб) 20:42

На личности? Я указываю на недостатки твоих решений, на пробелы в твоих знаниях, направляя тебя в верную сторону. То что ты воспринимаешь указание на недостатки своих решений как личную обиду — это твои проблемы.

Ну, в общем-то, мне по барабану. Пусть будет .NET медленнее всего остального. Можешь смело возвращатся к использованию VB6 :) . Не смею больше отвлекать.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Быстродействие .NET

Сообщение sergey-911 » 07.02.2010 (Вс) 9:37

Хорошо Mit, конструктивную критику всегда уважаю.
Объясни плиз, каким образом можно в .NET подключиться к файлу *.mdb через SQL, а не OleDB, не теряя производительности?
С уважением, Сергей.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Быстродействие .NET

Сообщение MIT » 07.02.2010 (Вс) 11:41

Простейший Гуглозапрос может вывести на интересные топики, в частности и про подключение .mdf базы
С написанием строки подклчюения может помочь сайт http://www.connectionstrings.com/
Классы используй с префиксом Sql, а не OleDb.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Быстродействие .NET

Сообщение sergey-911 » 07.02.2010 (Вс) 14:26

Спасибо за ресурсы Mit. Но при всем уважении, как мне может помочь пример подключения к MS SQL EXPRESS БД *.mdf?
Код: Выделить всё
SQLConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename=\App_Data\Overland.mdf;Initial Catalog=Overland;Integrated Security=True;User Instance=True"

Ведь я имею дело с файловой БД *.mdb? Поясни плиз, не могу разобраться. :(
С уважением, Сергей.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Быстродействие .NET

Сообщение MIT » 07.02.2010 (Вс) 15:10

sergey-911 писал(а):Поясни плиз, не могу разобраться.
Писал, писал тут, понимаете ли, остросюжетный рассказ про использование SQL Server`а. И ты не поверишь, только сейчас до меня дошло, что гнусный Access не получится подключить к серверу.
Office & COM & OLE — братья навек.
Не слушай меня, короче :)
Надо больше спать, надо больше спать...

Разве что MS говорит, что если используешь OleDb, то использовать OleDb надо везде, а не местами. Сдается мне, что DbCommand еще более абстрактная штука чем OleDbCommand. Хотя уже и не факт :)
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Быстродействие .NET

Сообщение sergey-911 » 07.02.2010 (Вс) 16:24

И что это значит?
Что ни что не поможет увеличить быстродействие? Ни метод подключения, ни настройки компиляции?
А как, в таком случае пишут профессиональные проекты на .NET? Неужели их быстродействие заключается в загрузке всех возможных форм в фоновом режиме и дальнейшем отображении уже подгруженной формы?
С уважением, Сергей.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Быстродействие .NET

Сообщение MIT » 07.02.2010 (Вс) 17:02

sergey-911 писал(а):И что это значит?
Это значит что ты не хочешь думать над решением проблемы, а хочешь что бы решение было дано тебе готовым.
Так вот, я предложил тебе перевести весь код на использование OleDb и даже дал пример, но ты либо не дочитал до конца, либо плевать хотел.

sergey-911 писал(а):А как, в таком случае пишут профессиональные проекты на .NET?
В профессиональных проектах нормальные люди не используют базы Access`а :wink:
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Быстродействие .NET

Сообщение sergey-911 » 07.02.2010 (Вс) 19:05

Спасибо за пример Mit.
Получилось примерно этакое:
Код: Выделить всё
        Dim connectString As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                                    "Data Source=C:\Users\Sergey\Documents\Visual Studio 2008\Projects\Склад\BD\Sklad.mdb"
        Dim cn As OleDbConnection = New OleDbConnection(connectString)
        cn.Open()
        Dim selectString As String = "SELECT ID_EdIzm AS Код, EdIzm AS [Единицы измерения], EdIzmLong AS [Полное наименование] FROM EdIzm ORDER BY [EdIzm]"
        Dim cmd As OleDbCommand = New OleDbCommand(selectString, cn)
        Dim reader As OleDbDataReader = cmd.ExecuteReader()

        Dim tbl As New DataTable("Table")
        tbl.Load(reader)
        Dim ds As New DataSet
        ds.Tables.Add(tbl)

        C1TrueDBGrid1.DataSource = Nothing
        C1TrueDBGrid1.DataMember = tbl.TableName
        C1TrueDBGrid1.DataSource = ds

        reader.Close()
        cn.Close()


Если честно - прироста в скорости не заметил, по сравнению с предыдущим примером. :(
С уважением, Сергей.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Быстродействие .NET

Сообщение MIT » 07.02.2010 (Вс) 19:14

Можешь базу в личку мне кинуть? Попробую что-нибудь придумать.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Быстродействие .NET

Сообщение sergey-911 » 08.02.2010 (Пн) 19:11

Спасибо Mit, только проект в читабельный вид приведу. В нем куча компонентов. Надо все лишнее выкинуть. И еще в одном месте "затыку" нашел, при сохранении настроек грида, реально подтормаживает работу.
С уважением, Сергей.

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Re: Быстродействие .NET

Сообщение Dmitriy2003 » 08.02.2010 (Пн) 23:50

OleDBReader/DataGridView

Изображение

Изображение

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Re: Быстродействие .NET

Сообщение Dmitriy2003 » 09.02.2010 (Вт) 8:25

(x64) SqlDataReader / DataGridView

Изображение

Emzari
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 129
Зарегистрирован: 06.09.2002 (Пт) 9:08
Откуда: Georgia

Re: Быстродействие .NET

Сообщение Emzari » 15.02.2010 (Пн) 18:34

Не знаю стоит ли загружать в дата грид одновременно 40 000 строк? Думаю что нет.
Не знаю как у TrueDBGrid но у стандартного DataGridView есть свойство VirtualMode с помощю которого можно динамически подгружать нужные данные в таблицу. Эсли TrueDBGrid такой крутой тогда у него тоже будет свой механизм для реализации VirtualMode. Думаю тебе нужна юзать в эту сторону а не искать способов как ускорить процесс запольнения таблицы.

ASD
Модератор
Модератор
Аватара пользователя
 
Сообщения: 1758
Зарегистрирован: 07.12.2001 (Пт) 21:08
Откуда: Russia

Re: Быстродействие .NET

Сообщение ASD » 19.02.2010 (Пт) 0:58

А тебе точно Dataset нужен? Ты все равно только на чтение получаешь таблицу.
Возможны еще варианты.
1. Заполнять из ридера в цикле.
2. таблицу сначала создать уже с колонками и потом ее заполнять.

Но надо пробовать. Да и как правильно писали, в грид столько записей пихать не круто. Одной памяти сколько скушается.

Ах да.. еще чере DataAdapter попробуй. Особенно если надо сохранять данные, и если тебе DataSet не принципиален, нафик его. Лишний обьект.
Moderator VBStreets
---------------------------


Вернуться в Visual Basic .NET

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

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

    TopList