Loading...
sevdalin avatar sevdalin 38 Точки

Необяснима разлика в performance-а?

Здравейте, случи ми се нещо много странно, поне за мен. Решавах задача, в която трябваше да открием, колко пъти в даден String има някакъв substring, като overlapping-а е позволено.

Пример:

text = aaaaaa

substring = aa

Occurrances = 5

Реших задачата по следният начин:

class CountSubtringOccurrences
{
    static void Main()
    {
        string text = Console.ReadLine().ToLower();
        string substring = Console.ReadLine().ToLower();

        int counter = 0;
        int indexOfOccurrence = text.IndexOf(substring);

        while (indexOfOccurrence != -1)
        {
            counter++;
            indexOfOccurrence = text.IndexOf(substring, indexOfOccurrence + substring.Length - 1);
            //indexOfOccurrence = text.IndexOf(substring, indexOfOccurrence + 1);
        }
        Console.WriteLine(counter);
    }
}

Но Judge ми даваше Time error на последните 2 теста. Помъчих се още и пробвах 1-2 варианта, ама нищо не се получи. След което, погледнах видеото от упражненията и видях, че те са го решили по абсолютно същият начин, с една единствена разлика, която довежда до над 0.140 сек разлика в performance-a! Закоментираният ред в кода, е този който дава 0.015сек в Judge, а този който първоначално използвах дава 0.156сек. Не мога да си обесня как извикването на едно Lengh свойство, може да причини такъв damage!?

Надявам се някой може да обясни... най-малкото изглежда доста интересно!

Тагове:
0
C# Advanced 30/04/2017 20:19:09
ppbaev avatar ppbaev 157 Точки

Не е performance проблем това, просто влизаш в безкраен while цикъл и judge те реже за време. Пробвай си кода с:

text = aaaaaa

substring = a

indexOfOccurrence винаги е 0 в този случай;

String.Length се изчислява само веднъж в C#, когато се създаде даден стринг за първи път, не коства почти нищо да се извика многократно.

2
30/04/2017 20:58:37
sevdalin avatar sevdalin 38 Точки

Да... не се бях замислял, при търсенето на един char просто, какво ще се получи... ама си прав. И все пак не е лоша идеята ми, ама когато има такива специфични търсения и се чупи :(

Благодаря за find-a :)

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.