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

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

sevdalin avatar sevdalin 37 Точки

Необяснима разлика в 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 156 Точки

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

text = aaaaaa

substring = a

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

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

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

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

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

0