Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

​Какой вид индексирования быстрее?

274  
Murr патриот30.05.18 16:02
Murr
30.05.18 16:02 

Какой вид индексирования быстрее?


Собственно - при доступе к данным в DataRow

можно индексировать порядковым номером, именем поля и колонкой данных.


Какой из них работает быстрее?

#1 
fronin прохожий30.05.18 17:07
fronin
NEW 30.05.18 17:07 
в ответ Murr 30.05.18 16:02

Может не по теме. Но надо не забывать про качество хостинга. Посмотрите книжку «Продвижение сайта в поисковых системах» (И.Ашманов, А.Иванов)

#2 
  moose старожил30.05.18 17:36
NEW 30.05.18 17:36 
в ответ Murr 30.05.18 16:02

как всегда, забанили везде кроме этого раздела?


гугыл, а там что-нибудь вроде the fastest data indexing datarow

#3 
Murr патриот30.05.18 18:06
Murr
NEW 30.05.18 18:06 
в ответ fronin 30.05.18 17:07

Это точно не по теме - нет у меня сайта.

Есть производная от DataRow и мне интересно какой индексер отрабатывает быстрее.

Тестить и/или искать в соурсниках сегодня не хочется...

#4 
AlexNek патриот30.05.18 22:59
AlexNek
NEW 30.05.18 22:59 
в ответ Murr 30.05.18 16:02
можно индексировать порядковым номером, именем поля и колонкой данных.

Как это индех по колонке данных? А остальное по числовому полю или по строковому?

Еще бы дописал что для Оракла.

Ничего подобного пока не попадалось

https://stackoverflow.com/questions/212264/how-to-choose-a...

#5 
Murr патриот30.05.18 23:20
Murr
NEW 30.05.18 23:20 
в ответ AlexNek 30.05.18 22:59

Было бы нужно для Оракла - Я бы написал что надо для Оракла.

Интересует для обычного DataRow.

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


Примерно так:


int column1 = 1;

DataColumn dc = table.Columns[column1];

String columnName = dc.ColumnName;


DataRow dr = dt.NewRow();


var a = dr[1];

var b = dr[dc];

var c = dr[columnName];


Вопрос - какой из индексеров шустрее?

Когда-то давно вроде самым шустрым был цифровой,

но билли пользует dc.

Вот Я и застрял с вопросом...


#6 
AlexNek патриот30.05.18 23:36
AlexNek
Murr патриот31.05.18 01:12
Murr
NEW 31.05.18 01:12 
в ответ AlexNek 30.05.18 23:36

Видимо вторую линку придется брать за основу и писать тест с датаколумами.

#8 
AlexNek патриот31.05.18 01:23
AlexNek
NEW 31.05.18 01:23 
в ответ Murr 31.05.18 01:12

зачем проверять очевидные вещи?


public object this[int columnIndex] {
            get {
                DataColumn column = _columns[columnIndex];

                int record = GetDefaultRecord();
                _table.recordManager.VerifyRecord(record, this);
                VerifyValueFromStorage(column, DataRowVersion.Default, column[record]);
                return column[record];
            }
        }

public object this[DataColumn column] {
            get {
                CheckColumn(column);

                int record = GetDefaultRecord();
                _table.recordManager.VerifyRecord(record, this);
                VerifyValueFromStorage(column, DataRowVersion.Default, column[record]);
                return column[record];
            }

private void CheckColumn(DataColumn column) {
            if (column == null) {
                throw ExceptionBuilder.ArgumentNull("column");
            }
 
            if (column.Table != _table) {
                throw ExceptionBuilder.ColumnNotInTheTable(column.ColumnName, _table.TableName);
            }
        }
#9 
Программист коренной житель31.05.18 07:25
NEW 31.05.18 07:25 
в ответ AlexNek 31.05.18 01:23
зачем проверять очевидные вещи?

1-й индексер на 1 такт быстрее? :)

#10 
Murr патриот31.05.18 10:44
Murr
NEW 31.05.18 10:44 
в ответ AlexNek 31.05.18 01:23

А что именно предполагается очевидным?


Что:

DataColumn column = _columns[columnIndex];

быстрее:

CheckColumn(column);

оно совсем не очевидно - первое зависит от количества элементов, второе имеет фиксированное количество операциj.

#11 
Murr патриот31.05.18 11:03
Murr
NEW 31.05.18 11:03 
в ответ Программист 31.05.18 07:25

Все же решил написать тест:


Table contain 8 fields


Generating data...

Data generated: 10000 rows in 54 miliseconds


Testing int indexer

Testing string indexer

Testing DataColumn indexer


int indexing

total: 33815.2 ms

each: 338.152ms


string indexing

total: 57607.1559 ms

each: 576.071559ms


DataColumn indexing

total: 17460.3316 ms

each: 174.603316ms


Так что придется мне слегка переделать кучку кода: 576 вс 174 - существенно...

#12 
Murr патриот31.05.18 11:48
Murr
NEW 31.05.18 11:48 
в ответ Murr 31.05.18 11:03

В свете результатов теста возникает интересный вопросик:

- можно ли заменить DataColumnCollection Columns in DataTable другой, типизированной, коллекцией?


С наскоку у меня не получилось. Т.е. написать нужную коллекцию проблемы нет, а вот встроить ее в DataTable

пока не вышло...


Просто не хочется иметь каждый колумн в виде отдельного поля в коде таблицы.

#13 
AlexNek патриот31.05.18 13:00
AlexNek
NEW 31.05.18 13:00 
в ответ Murr 31.05.18 10:44
первое зависит от количества элементов

Что то я не совсем понимаю

a[2] =0;

a[102]=0;

на сколько миллисекунд будет разница и почему? Или у тебя количество колонок гораздо больше?

#14 
AlexNek патриот31.05.18 13:03
AlexNek
NEW 31.05.18 13:03 
в ответ Murr 31.05.18 11:03

Исходники теста можешь скинуть? Интересно понять результаты.

#15 
Murr патриот31.05.18 15:51
Murr
NEW 31.05.18 15:51 
в ответ AlexNek 31.05.18 13:03

Вот тесты. Адаптировал вторую линку.


Снова не проходит файлик... шлю мылом.


#16 
Murr патриот31.05.18 15:54
Murr
NEW 31.05.18 15:54 
в ответ AlexNek 31.05.18 13:00
и почему?

-----

Там не массив. Там нечто представляемое массивом. И вместо индексирования выполняется поиск,


#17 
AlexNek патриот31.05.18 16:00
AlexNek
NEW 31.05.18 16:00 
в ответ Murr 31.05.18 15:54
Там не массив. Там нечто представляемое массивом

описание есть?

#18 
Murr патриот31.05.18 16:02
Murr
NEW 31.05.18 16:02 
в ответ AlexNek 31.05.18 16:00

DataColumnCollection.cs?

Мне на

http://www.dotnetframework.org/

пока нельзя

#19 
AlexNek патриот31.05.18 16:48
AlexNek
NEW 31.05.18 16:48 
в ответ Murr 31.05.18 16:02

Описание на то как реализован массив "после IL"

#20