производительность строки c # - что быстрее сравнивать, текст строки или длина строки - PullRequest
4 голосов
/ 06 сентября 2010

Эй, ребята, мне нужно прочитать огромный XML-файл, который содержит более 3 миллионов записей и более 10 миллионов вложенных элементов

Естественно, я использую xmltextreader и сократил время анализа примерно до 40 секунд с более ранних 90 секунд, используя несколько приемов и советов по оптимизации

но я хочу еще больше сэкономить время обработки, насколько я могу, поэтому ниже вопрос

довольно много элементов имеют тип xs: логический, и поставщик данных всегда представляет значения как "true" или "false" - никогда не "1" или "0"

для таких случаев мой самый ранний код был:

if (xmlTextReader.Value == "true")
{
    bool subtitled = true;
}

, который я дополнительно оптимизировал для:

if (string.Equals(xmlTextReader.Value, "true", StringComparison.OrdinalIgnoreCase))
{
    bool subtitled = true;
}

Я хотел бы знать, будет ли ниже самый быстрый (потому что это "true" или "false")?

if (xtr.value.length == 4)
{
    bool subtitled = true;
}

Ответы [ 7 ]

7 голосов
/ 06 сентября 2010

Да, это быстрее, потому что вы сравниваете только одно значение, а именно длину строки.

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

Единственная проблема, с которой вы столкнулись в этом решении, заключается в том, что есликогда-нибудь значение изменится с true на, скажем, 1, здесь вы столкнетесь с проблемой.

4 голосов
/ 06 сентября 2010

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

3 голосов
/ 06 сентября 2010

Как насчет сравнения первого символа с "t"?

Должно (возможно :) быть быстрее, чем сравнение всей строки ..

2 голосов
/ 06 сентября 2010

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

Вы также можете попробовать что-то подобное, используя следующий подход:

Boolean.TryParse(xmlTextReader.Value, out subtitled)

Я знаю, что это не имеет никакого отношения к вашему вопросу, но я решила, что все равно брошу его туда.

0 голосов
/ 06 сентября 2010

Если вы знаете, что это "true" или "false", последний фрагмент должен быть самым быстрым.

В любом случае, вы также можете написать:

bool subtitled = (xtr.Value.length == 4);

Это должно быть еще быстрее.

0 голосов
/ 06 сентября 2010

Сравнение и синтаксический анализ строк очень медленно в .Net, я бы рекомендовал избегать интенсивного анализа / сравнения строк в .Net.

Если вы вынуждены это делать - используйте высокооптимизированный неуправляемый или небезопасный код и используйте параллелизм.

ИМХО.

0 голосов
/ 06 сентября 2010

Не можете ли вы просто написать модульный тест? Запустите каждый сценарий, например, 1000 раз и сравните дату и время.

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