Здравствуйте, C...R...a...S...H, Вы писали:
CRA>Здравствуйте, Kore Sar, Вы писали:
KS>>Запустите этот код. KS>>U.StartWith работает в 10 раз быстрее, чем String.StartsWith. KS>>Какого черта?
KS>>
Здравствуйте, Kore Sar, Вы писали:
KS>Ок. А что это означает? Подробности можно?
Данная функция реализована не как Managed code, а как Unmanaged
Какая разница в этих понятиях можно посмотреть здесь
Там было написано русским по белому...
Re[4]: string.StartsWith очень-очень медленная. С чего вдруг
Здравствуйте, C...R...a...S...H, Вы писали:
CRA>Здравствуйте, Kore Sar, Вы писали:
KS>>Ок. А что это означает? Подробности можно? CRA>Данная функция реализована не как Managed code, а как Unmanaged
1) Вы забыли упомянуть на каких конкретно сях заимплеменчен string.StrartsWith. Т.е. вы забыли сказать в вашем первом сообщении про Unmanaged.
2) Я знаю различия между этими вещами.
CRA>Какая разница в этих понятиях можно посмотреть здесь
3) Я даже прочитал на всякий случай эту бесполезнаю для меня статью.
4) А вот ответа на вопрос "Почему мой код быстрее string.StartsWith?" я так и не нашел.
Спрашиваю еще раз.
Почему мой Managed код работает в 10 раз быстрее Unmanaged кода фреймворка?
Re[5]: string.StartsWith очень-очень медленная. С чего вдруг
Здравствуйте, Kore Sar, Вы писали:
KS>Здравствуйте, C...R...a...S...H, Вы писали:
KS>Спрашиваю еще раз. KS>Почему мой Managed код работает в 10 раз быстрее Unmanaged кода фреймворка?
Я очень сильно извиняюсь.
Просто я протупил
Я почему то подумал, что ваша функция работает медленнее.
Еще раз извиняюсь.
Теперь по сути дела:
String.StartsWith работает с использование культур, что очень сказывается на его производительности.
Но вы можете на это влиять используя myStrings[i].StartsWith(patterns[i], StringComparison.Ordinal);
Тогда производительность ваших методов будет одинакова.
Там было написано русским по белому...
Re: string.StartsWith очень-очень медленная. С чего вдруг?
Здравствуйте, Kore Sar, Вы писали:
KS>Запустите этот код. KS>U.StartWith работает в 10 раз быстрее, чем String.StartsWith. KS>Какого черта?
Такого черта, что ты сравниваешь значения коде-поинты, т.е. 2-байтных элементов utf-16-строки,
а public bool StartsWith(string value) сравнивает с учетом CultureInfo.CurrentCulture.
Если нужна скорость, юзай
public bool StartsWith(
string value,
StringComparison comparisonType
),
где comparisonType = Ordinal.
Re[2]: string.StartsWith очень-очень медленная. С чего вдруг
Здравствуйте, s.and, Вы писали:
SA>Здравствуйте, Kore Sar, Вы писали:
KS>>Запустите этот код. KS>>U.StartWith работает в 10 раз быстрее, чем String.StartsWith. KS>>Какого черта?
SA>Такого черта, что ты сравниваешь значения коде-поинты, т.е. 2-байтных элементов utf-16-строки, SA>а public bool StartsWith(string value) сравнивает с учетом CultureInfo.CurrentCulture.
SA>Если нужна скорость, юзай SA>public bool StartsWith( SA> string value, SA> StringComparison comparisonType SA>), SA>где comparisonType = Ordinal.
Пример мне кажется не коректным
При выбранной генерации коротких случайных строк совпадений почти нет
т.е. методы выходят проверив только первый символ
другими словами проверяем на сколько быстро вызываются методы
Re[4]: string.StartsWith очень-очень медленная. С чего вдруг
Здравствуйте, icool, Вы писали:
I>Пример мне кажется не коректным I>При выбранной генерации коротких случайных строк совпадений почти нет I>т.е. методы выходят проверив только первый символ I>другими словами проверяем на сколько быстро вызываются методы
Сделал так, чтобы половина результатов проверяли все символы.
ну если еще добавить проверок которые есть в String то скорее всего вы сравняетесь.
например ваша функция некорректно работакт если pattern длиннее number
Re[2]: string.StartsWith очень-очень медленная. С чего вдруг
Здравствуйте, cvetkov, Вы писали:
C>ну если еще добавить проверок которые есть в String то скорее всего вы сравняетесь. C>например ваша функция некорректно работакт если pattern длиннее number
Добавил проверки. Результат абсолютно тот же самый.
На самом деле ничего не изменилось )
наверно имелось ввиду ... : myStrings[i].Substring(0,3);
а в цифрах опечатка так как они близки и в 10 раз не отличаются
это ладно
на самом деле с myStrings[i].Substring(3,3); // нет совпадений
тоже 10 раз
Здравствуйте, Kore Sar, Вы писали:
KS>ИСПОЛЬЗУЙТЕ ЭТО ВСЕГДА!
KS>public static class MyExtentionMethods
KS>{
KS> public static bool AsciiStartsWith(this string str, string pattern)
KS> {
KS> if (pattern.Length > number.Length) return false;
KS> bool match = true;
KS> for (int digitIndex = 0; digitIndex < pattern.Length && match; digitIndex++)
KS> {
KS> match = match && number[digitIndex].Equals(pattern[digitIndex]);
KS> }
KS> return match;
KS> }
KS>}
Прежде чем капслочить тут на всех, выставил бы для начала проверку аргументов что ль… во-вторых, надо бы всё-тки поточнее определиться, как называется первый параметр. Ну, и в-третьих, раз уж крутишься в цикле до тех пор, пока предекат (match) истинный, то чего его запоминать и умножать на самого себя? Достаточно было бы
for(var i = 0; i < pattern.Length; i++) {
if(!number[i].Equals(pattern[i])) {
return false;
}//if
}//forreturn true;
А на последок: слово "Ascii" в имени метода не соответствует тому, что происходит внутри метода — проверки, что обрабатываемые строки содержат символы лишь Askii-диапазона нигде нет. Так что название тоже не мешает подобрать более подходящее.
Help will always be given at Hogwarts to those who ask for it.
Re[4]: string.StartsWith очень-очень медленная. С чего вдруг
Здравствуйте, _d_m_, Вы писали:
___> ___>Где пересоздаются сравниваемые строки в верхнем регистре
Откуда такая информация? Там все заканчивается вызовом некой:
private static extern unsafe int nativeCompareOrdinalIgnoreCaseEx(void* pNativeTextInfo, string strA, int indexA, string strB, int indexB, int length);
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[5]: string.StartsWith очень-очень медленная. С чего вдруг
KS>public static class MyExtentionMethods
KS>{
KS> public static bool AsciiStartsWith(this string str, string pattern)
KS> {
KS> if (pattern.Length > number.Length) return false;
KS> bool match = true;
KS> for (int digitIndex = 0; digitIndex < pattern.Length && match; digitIndex++)
KS> {
KS> match = match && number[digitIndex].Equals(pattern[digitIndex]);
KS> }
KS> return match;
KS> }
KS>}
KS>
if (pattern.Length > number.Length) return false;
А что такое number.Length? И почему pattern.Length > number.Length, а не pattern.Length != number.Length? А если pattern null?
Вообще в 99.99% случаях производительность штатной функции будет достаточна. Поэтому делать какой-то самопал, в котором еще придется кому-то разбираться, пожалуй не стоит.