Re[2]: Всегда ли as быстрее is ?
От: Воронков Василий Россия  
Дата: 31.01.07 14:42
Оценка:
Здравствуйте, Sinclair, Вы писали:

AV>>Часто встречается рекомендация использовать следующий код, если нужно использовать переменную a:

S>А можно привести эту "часто встречающуюся рекомендацию", чтобы мы могли наконец найти ее автора и скормить его в garbage collector?
S>Читать здесь
Автор(ы): Владислав Чистяков (VladD2)
Дата: 18.12.2004
Работая над открытыми проектами, автор заметил, что операторы as и is многими программистами зачастую используются ненадлежащим образом. Результатом очередного двухчасового поиска ошибки и стала эта статья.


до просветления.


В данной статье эта рекомендации кстати и не ставится под сомнение. Сравниваем два примера кода до просветления:

A a = o as A;

if (a != null)
    a.DoSomething();


и

(a as A).DoSomething();
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Всегда ли as быстрее is ?
От: Andrej-V  
Дата: 01.02.07 04:58
Оценка:
Господа, читающие эту ветку в rsdn.
Предлагаю вам почитать ее в gotdotnet.ru. Несмотря на то, что создана
тема была в rsdn, некоторые ответы почему-то здесь не отображаютя. По
сему поводу написал модераторам gotdotnet (как написать в rsdn не
нашел), но кроме пропадания на время всей ветки ничего не изменилось.
Кстати это не первый случай и, возможно, уже закономерность. Создавая
здесь (rsdn) тему, обязательно надо просматривать gotdotnet, т.к. там,
возможно есть ответы, а создавая тему в gotdotnet надо учитывать, что
в rsdn она, возможно, вообще не появится (такое у меня уже было).
Господа, модераторы. Скажите что-нибудь.
Re[3]: Всегда ли as быстрее is ?
От: orange_  
Дата: 01.02.07 06:01
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>В данной статье эта рекомендации кстати и не ставится под сомнение. Сравниваем два примера кода до просветления:


ВВ>
ВВ>A a = o as A;

ВВ>if (a != null)
ВВ>    a.DoSomething();
ВВ>


ВВ>и


ВВ>
ВВ>(a as A).DoSomething();
ВВ>


И что всё-таки быстрее работает и лучше? Цифры после проведенного эксперимента есть?
Re[3]: Всегда ли as быстрее is ?
От: Andrej-V  
Дата: 01.02.07 08:57
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>
ВВ>(a as A).DoSomething();
ВВ>


Чего-то непонятно: исключение будет если a не A.
Re[4]: Всегда ли as быстрее is ?
От: Воронков Василий Россия  
Дата: 01.02.07 14:05
Оценка:
Здравствуйте, Andrej-V, Вы писали:

AV>Чего-то непонятно: исключение будет если a не A.


А чего непонятного-то? Будет "плохой" NullReferenceException вместо "хорошего" InvalidCastException. NullReferenceException сам по себе не говорит что произошла ошибка при привидении. В данном примере это может и не так критично, но в некоторых случаях можно таким весьма неплохо запрятать реальную ошибку. Потом сиди и парься почему у тебя Null в метод передается — то ли действительно null, то ли ошибка привидения.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Всегда ли as быстрее is ?
От: Воронков Василий Россия  
Дата: 01.02.07 14:05
Оценка:
Здравствуйте, orange_, Вы писали:

_>И что всё-таки быстрее работает и лучше? Цифры после проведенного эксперимента есть?


Это:

A a = o as A;

if (a != null)
    a.DoSomething();


работает быстрее чем:

A a2 = null;

if (a is A)
    a2 = (A)a;


так как во втором случае совершается двойная работа — проверка типа (is) и привидение через си-каст.
НО: В 99% разница между этими примерами кода настолько копеечная по скорости, что перестраиваться на метод с as-ом, когда привык писать через си-каст и is смысле никакого нет.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Всегда ли as быстрее is ?
От: rameel https://github.com/rsdn/CodeJam
Дата: 01.02.07 16:54
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>
ВВ>A a = o as A;

ВВ>if (a != null)
ВВ>    a.DoSomething();
ВВ>

ВВ>работает быстрее чем:
ВВ>
ВВ>A a2 = null;

ВВ>if (a is A)
ВВ>    a2 = (A)a;
ВВ>


ВВ>так как во втором случае совершается двойная работа — проверка типа (is) и привидение через си-каст.


Это верно только, если результат a is A в большинстве случаев истинен. Если же проверять приходиться среди множества, из которых только, к примеру, один верный, то второй вариант уже будет предпочтительней.
... << RSDN@Home 1.2.0 alpha rev. 669>>
Re[5]: Всегда ли as быстрее is ?
От: Andrej-V  
Дата: 01.02.07 18:00
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Здравствуйте, Andrej-V, Вы писали:


AV>>Чего-то непонятно: исключение будет если a не A.


ВВ>А чего непонятного-то? Будет "плохой" NullReferenceException вместо "хорошего" InvalidCastException. NullReferenceException сам по себе не говорит что произошла ошибка при привидении. В данном примере это может и не так критично, но в некоторых случаях можно таким весьма неплохо запрятать реальную ошибку. Потом сиди и парься почему у тебя Null в метод передается — то ли действительно null, то ли ошибка привидения.


1. Привидение это то, которое в простыне с вырезанными дырками.
2. Непонятно, как можно это использовать. Т.е. еще бы пару строк, а то пока похоже на вырезание гландов... сами знаете как.
Re[6]: Всегда ли as быстрее is ?
От: Воронков Василий Россия  
Дата: 01.02.07 18:03
Оценка:
Здравствуйте, Andrej-V, Вы писали:

AV>1. Привидение это то, которое в простыне с вырезанными дырками.

AV>2. Непонятно, как можно это использовать. Т.е. еще бы пару строк, а то пока похоже на вырезание гландов... сами знаете как.

Использовать что?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Всегда ли as быстрее is ?
От: Andrej-V  
Дата: 01.02.07 18:03
Оценка:
Здравствуйте, rameel, Вы писали:

R>Здравствуйте, Воронков Василий, Вы писали:


ВВ>>
ВВ>>A a = o as A;

ВВ>>if (a != null)
ВВ>>    a.DoSomething();
ВВ>>

ВВ>>работает быстрее чем:
ВВ>>
ВВ>>A a2 = null;

ВВ>>if (a is A)
ВВ>>    a2 = (A)a;
ВВ>>


ВВ>>так как во втором случае совершается двойная работа — проверка типа (is) и привидение через си-каст.


R>Это верно только, если результат a is A в большинстве случаев истинен. Если же проверять приходиться среди множества, из которых только, к примеру, один верный, то второй вариант уже будет предпочтительней.



Не могли бы объяснить свое последнее предложение? Т.е. почему так?
Re[7]: Всегда ли as быстрее is ?
От: rameel https://github.com/rsdn/CodeJam
Дата: 01.02.07 19:31
Оценка:
Здравствуйте, Andrej-V, Вы писали:

AV>Не могли бы объяснить свое последнее предложение? Т.е. почему так?


...
так как во втором случае совершается двойная работа — проверка типа (is) и привидение через си-каст.


Вот я и говорю, что эта двойная работа будет только, если результатом is будет чаще true. А вот если ожидается, что наоборот, да и в большинстве случаев, то is будет отрабатывать быстрее, чем as

Только вот разницу в скорости и в микроскоп бывает не разглядишь
... << RSDN@Home 1.2.0 alpha rev. 669>>
Всегда ли as быстрее is ?
От: Аноним  
Дата: 28.01.07 07:15
Оценка:
я обычно делаю конструкцию вида:

if (b as A != null)
{
...
}

если большой селект по типу тогда сначало получаю тип, потом его сравниваю
Type t = b.GetType();

if (t == typeof(A))
{..}
else if (...)
else if (...)
else if (...)
Любое удобство идет за счет мегагерцеф! : {<b>1</b>, <b>2</b>, <b>3</b>, 4, 5}


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Всегда ли as быстрее is ?
От: Аноним  
Дата: 28.01.07 07:47
Оценка:
]]если большой селект по типу тогда сначало получаю тип, потом его сравниваю
.
Пять баллов! Про полиморфизм ты похоже забыл...

Две капли морфия облегчат тебе жизнь.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Всегда ли as быстрее is ?
От: Аноним  
Дата: 28.01.07 08:07
Оценка:
Nimnul, я ставил условие:
Часто встречается рекомендация использовать следующий код, если нужно использовать переменную a...
В вашем коде она не создается и в этом случае непонятно почему не просто if(b is A){...}

А почему когда большой селект Вы на каждый тип, на совпадение с которым проверяется b, создаете объект Type (typeof(A)) вместо if(b is A){...}

Чего-то непонятно: на gotdot Ваш ответ есть, а на rsdn нет?



данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Всегда ли as быстрее is ?
От: Аноним  
Дата: 28.01.07 14:20
Оценка:
потому что когда делаешь (typeof(A)) компилятор подставляет type hendler'ы чиселки то быстрее сравниваются.
Любое удобство идет за счет мегагерцеф! : {<b>1</b>, <b>2</b>, <b>3</b>, 4, 5}


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Всегда ли as быстрее is ?
От: Аноним  
Дата: 28.01.07 14:23
Оценка: -1
Andrej-V

>>Чего-то непонятно: на gotdot Ваш ответ есть, а на rsdn нет?

Это все проделки тамошнего модератора Vlad2 он видимо обижается когда я указываю его ламерство
Любое удобство идет за счет мегагерцеф! : {<b>1</b>, <b>2</b>, <b>3</b>, 4, 5}


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Всегда ли as быстрее is ?
От: Аноним  
Дата: 28.01.07 14:29
Оценка:
>>Пять баллов! Про полиморфизм ты похоже забыл...

ээ а что не так, чото я невкурил

string[] str = new string[10];
Type t = str.GetType();
if (t == typeof(object[]))
{
}
else if (t == typeof(System.Array))
{
}
else if (t == typeof(string[]))
{
Console.WriteLine("i am here");
}
Любое удобство идет за счет мегагерцеф! : {<b>1</b>, <b>2</b>, <b>3</b>, 4, 5}


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Всегда ли as быстрее is ?
От: Аноним  
Дата: 28.01.07 17:15
Оценка:
]]Это все проделки тамошнего модератора

Это проделки синхронизации.

Две капли морфия облегчат тебе жизнь.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Всегда ли as быстрее is ?
От: Аноним  
Дата: 28.01.07 17:21
Оценка:
]]ээ а что не так, чото я невкурил

Вывод консоли в студию

using System;

interface Interface
{
    
}

class ClassImplementor : Interface
{
}

class ClassImplementor2 : Interface
{
}

static class Program
{
    static void Main()
    {
        Interface[] implementors = new Interface[] { new ClassImplementor(), new ClassImplementor2() };
        
        for (int i = 0; i < implementors.Length; i++)
        {
            if (implementors[i].GetType() == typeof(Interface))
            {
                Console.WriteLine("eisernWolf sucker");
            }
            else
            {
                Console.WriteLine("You are sucker");
            }
        }
        
        Console.ReadLine();
    }
}

Две капли морфия облегчат тебе жизнь.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Всегда ли as быстрее is ?
От: Аноним  
Дата: 28.01.07 17:45
Оценка:
Кстати, ради забавы запусти-ка вот такой тестик:

using System;
using System.Diagnostics;

interface Interface
{
}

class ClassImplementor : Interface
{
}

class ClassImplementor2 : Interface
{
}

static class Program
{
    static void Main()
    {
        const int count = 10000000;
        
        ClassImplementor c = new ClassImplementor();
    
        Stopwatch sw = Stopwatch.StartNew();
    
        for (int i = 0; i < count; i++)
        {
            if (c is ClassImplementor)
            {
            }
        }
        
        sw.Stop();
        Console.WriteLine(sw.ElapsedMilliseconds);
        
        sw = Stopwatch.StartNew();
        
        for (int i = 0; i < count; i++)
        {
            if (c as ClassImplementor != null)
            {
            }
        }
        
        sw.Stop();
        Console.WriteLine(sw.ElapsedMilliseconds);
        
        sw = Stopwatch.StartNew();
        
        for (int i = 0; i < count; i++)
        {
            if (c.GetType() == typeof(ClassImplementor))
            {
            }
        }
        
        sw.Stop();
        Console.WriteLine(sw.ElapsedMilliseconds);
        
        Console.ReadLine();
    }
}


Ответы: 97 мс, 93 мс, 1070 мс

Ради 4 мс на таком количестве циклов вообще не вижу смысла париться. is и точка. А вот с typeof затык... И с твоей идиологией тоже

Две капли морфия облегчат тебе жизнь.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.