производительность indexOf () по сравнению с циклом функций делает то же самое - PullRequest
2 голосов
/ 17 января 2012

Я написал небольшую программу с использованием пользовательской функции indexOf, но хотел отклонить ее в пользу системного метода string.IndexOf ().

Но прежде чем начать рефакторинг, я из любопытства написал небольшую тестовую программу, чтобы посмотреть, насколько плохо работает моя функция по сравнению с системной строкой. IndexOf ()

Я заметил, что системная строка.IndexOf выглядит на на величину медленнее, чем итерация массива.

Processing random random string at 1000000 characters.
Processing method 1 system string.IndexOf
index 999999 took 620036 ticks
Processing method 2 custom IndexOf
index 999999 took 130007 ticks

Так что мой вопрос на самом деле; Я делаю это неправильно? Разве система не должна функционировать намного быстрее, чем что-либо еще, что я пишу на c #?

ТЛ; др тестовый сценарий

сначала я настроил некоторые тестовые данные, заполнив случайную строку некоторыми данными

StringBuilder sb = new StringBuilder(); 
Random r = new Random(); 
string c = "abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZ0123456789";
long before;
long after; 
for (int i = 0; i < 1000000; i ++) sb.Append(c[r.Next(c.Length)]);

и затем вставьте что-то в конец массива, который я хочу найти, в худшем случае

int j = sb.Length - 1 ;                                   
sb[j] = '"';

метод 1: системная строка.IndexOf

и затем проверьте, сколько тиков используется системной строкой. IndexOf ()

before = DateTime.Now.Ticks;
index = text.IndexOf("\"");
after = DateTime.Now.Ticks;

метод 2: пользовательский метод

и после этого я запускаю свой пользовательский код, который является просто статической функцией с циклом while, перебирающим массив символов.

before = DateTime.Now.Ticks; 
index = IndexOf(text, 0, '"', '/'); 
after = DateTime.Now.Ticks;

Ответы [ 3 ]

6 голосов
/ 17 января 2012

String.IndexOf также имеет перегрузку, которая принимает char в качестве параметра. Попробуй это. Ваша собственная реализация, очевидно, использует char, а не string.

index = text.IndexOf('"'); 

Вам следует повторить тесты несколько раз. Иногда первый запуск занимает больше времени, потому что методы объединяются, или потому что статические члены инициализируются или тому подобное.

Test1();
Test2();
// start time
for (i = 0; i < 100; i++) {
    Test1();
    Test2();
}
// stop time
5 голосов
/ 17 января 2012

Я думаю, что разница здесь в том, что когда вы вызываете String.IndexOf, вы используете строковый литерал, а ваша пользовательская функция использует символьный литерал.

Не видя вашей пользовательской реализации, ядумаю, что String.IndexOf метод более правильный (локали, юникод и все такое).

1 голос
/ 17 января 2012

Не зная, как работает ваша функция, может происходить несколько вещей:

1) Вы ищете персонажа с IndexAt vs String lookup

2) Чтобы сделать намного более точное сравнение, поместите ваш поисковый термин в случайных местах и ​​выполните десятки итераций каждого. Это может быть ХОРОШИЙ случай, если ваши победы, но библиотеки выигрывают в остальное время

3) Конечно, ничего не сказано о том, что библиотека оптимизирована для каждого решения, и вы можете очень легко реализовать что-то быстрее. Просто посмотрите на LINQ, чтобы увидеть, что

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...