Проблема с приведением типов
От: Злобастик  
Дата: 27.01.12 06:46
Оценка:
Коллеги, добрый день!

Возникла следующая проблема. Есть словарь, где ключ — это идентификатор модели, а значение — объект, являющийся наследником от базового абстрактного класса AbstractModel. (Т.е. тип словаря — Dictionary<string, AbstractModel>) Классов-наследников достаточно много. Для примера назовем их ConcreteModel1, ConcreteModel2 и т.д. Задача следующая — по заданному идентификатору (ключу) необходимо привести соответствующий объект (значение) к конкретному типу. Проблема в том, что тип этот я не знаю. Пока что вижу 3 варианта решения:

1. Добавить в AbstractModel поле перечислимого типа, по которому можно было бы определить тип модели (возникают риски при ошибке указания нужного перечисления)
2. Использовать рефлекшн (неэстетично)
3. Использовать говнокод (var cm = abstractModel as ConcreteModel1; if (cm != null) { делаем приведение })

Задача выглядит тривиальной, но я за 10 лет ни с чем подобным не сталкивался. Может быть, есть какие-нибудь варианты элегантного решения?
Re: Проблема с приведением типов
От: Аноним  
Дата: 27.01.12 06:49
Оценка:
Здравствуйте, Злобастик, Вы писали:

З>Коллеги, добрый день!


З>Возникла следующая проблема. Есть словарь, где ключ — это идентификатор модели, а значение — объект, являющийся наследником от базового абстрактного класса AbstractModel. (Т.е. тип словаря — Dictionary<string, AbstractModel>) Классов-наследников достаточно много. Для примера назовем их ConcreteModel1, ConcreteModel2 и т.д. Задача следующая — по заданному идентификатору (ключу) необходимо привести соответствующий объект (значение) к конкретному типу. Проблема в том, что тип этот я не знаю. Пока что вижу 3 варианта решения:


З>1. Добавить в AbstractModel поле перечислимого типа, по которому можно было бы определить тип модели (возникают риски при ошибке указания нужного перечисления)

З>2. Использовать рефлекшн (неэстетично)
З>3. Использовать говнокод (var cm = abstractModel as ConcreteModel1; if (cm != null) { делаем приведение })

З>Задача выглядит тривиальной, но я за 10 лет ни с чем подобным не сталкивался. Может быть, есть какие-нибудь варианты элегантного решения?



Зачем приводить в итоге ? что дальше?
Например можно использовать interface
Re[2]: Проблема с приведением типов
От: Злобастик  
Дата: 27.01.12 06:57
Оценка:
Здравствуйте, Аноним, Вы писали:

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


З>>Коллеги, добрый день!


З>>Возникла следующая проблема. Есть словарь, где ключ — это идентификатор модели, а значение — объект, являющийся наследником от базового абстрактного класса AbstractModel. (Т.е. тип словаря — Dictionary<string, AbstractModel>) Классов-наследников достаточно много. Для примера назовем их ConcreteModel1, ConcreteModel2 и т.д. Задача следующая — по заданному идентификатору (ключу) необходимо привести соответствующий объект (значение) к конкретному типу. Проблема в том, что тип этот я не знаю. Пока что вижу 3 варианта решения:


З>>1. Добавить в AbstractModel поле перечислимого типа, по которому можно было бы определить тип модели (возникают риски при ошибке указания нужного перечисления)

З>>2. Использовать рефлекшн (неэстетично)
З>>3. Использовать говнокод (var cm = abstractModel as ConcreteModel1; if (cm != null) { делаем приведение })

З>>Задача выглядит тривиальной, но я за 10 лет ни с чем подобным не сталкивался. Может быть, есть какие-нибудь варианты элегантного решения?



А>Зачем приводить в итоге ? что дальше?

А>Например можно использовать interface

Конкретный тип нужен для того, чтобы понять, каким алгоритмом его обрабатывать. А интерфейс как поможет? Я что-то в упор не вижу.
Re[3]: Проблема с приведением типов
От: Аноним  
Дата: 27.01.12 07:00
Оценка:
Здравствуйте, Злобастик, Вы писали:

З>Конкретный тип нужен для того, чтобы понять, каким алгоритмом его обрабатывать. А интерфейс как поможет? Я что-то в упор не вижу.


Реализовать алгоритм обработки в самом объекте, почему нет?
Re[4]: Проблема с приведением типов
От: Злобастик  
Дата: 27.01.12 07:06
Оценка:
Здравствуйте, Аноним, Вы писали:

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


З>>Конкретный тип нужен для того, чтобы понять, каким алгоритмом его обрабатывать. А интерфейс как поможет? Я что-то в упор не вижу.


А>Реализовать алгоритм обработки в самом объекте, почему нет?


Эти объекты должны содержать исключительно данные. (по сути эти объекты — часть модели данных). Алгоритмы должны быть известны контроллеру (под известны я подразумеваю, что либо реализованы в нем, либо делегированы). Этот же контроллер обновляет графическое представление при изменении модели.
Re[5]: Проблема с приведением типов
От: Doc Россия http://andrey.moveax.ru
Дата: 27.01.12 07:21
Оценка:
Здравствуйте, Злобастик, Вы писали:

З>Алгоритмы должны быть известны контроллеру (под известны я подразумеваю, что либо реализованы в нем, либо делегированы). Этот же контроллер обновляет графическое представление при изменении модели.


Бизнес-логика в контроллере? Это что за шаблон используется
Затем чуствуется в этой логике дыра. Вы изначально используете абстракцию, но потом приводите к конкоретным реализациям.

Ну а по теме — вроде само логичное тут enum. Но я бы все же пересмотрел архитектуру.
Re[5]: Проблема с приведением типов
От: ksg71 Германия  
Дата: 27.01.12 07:23
Оценка: +1
Здравствуйте, Злобастик, Вы писали:

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


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


З>>>Конкретный тип нужен для того, чтобы понять, каким алгоритмом его обрабатывать. А интерфейс как поможет? Я что-то в упор не вижу.


А>>Реализовать алгоритм обработки в самом объекте, почему нет?


З>Эти объекты должны содержать исключительно данные. (по сути эти объекты — часть модели данных). Алгоритмы должны быть известны контроллеру (под известны я подразумеваю, что либо реализованы в нем, либо делегированы). Этот же контроллер обновляет графическое представление при изменении модели.


заведите "реестр" алгоритмов(стратегий)

interface IRegistry<T> where T : ModelBase
{
    IStrategy Get(T model);
}


реализацию постройте на базе словаря Type — IStrategy, где Type конкретный тип модели
Das Reich der Freiheit beginnt da, wo die Arbeit aufhört. (c) Karl Marx
Re: Проблема с приведением типов
От: hi_octane Беларусь  
Дата: 27.01.12 07:32
Оценка: +1
З>Задача выглядит тривиальной, но я за 10 лет ни с чем подобным не сталкивался. Может быть, есть какие-нибудь варианты элегантного решения?

Если C#4, можно на динамиках:

dynamic d = abstractInstance;

//динамик сам разрулит тип и вызовет нужный метод
ConcreteStrategy(d);

void ConcreteStrategy(ConcreteModel1 cm);
void ConcreteStrategy(ConcreteModel2 cm);
void ConcreteStrategy(ConcreteModel3 cm);


void ConcreteStrategy(AbstractModel am)
{
  throw new NotImplementedException("Нет стратегии для модели типа " + am.GetType().Name);
}


В более старых C# можно двойной диспетчеризацией.

Ну и само собой лучше всего на Nemerle
Re[6]: Проблема с приведением типов
От: Злобастик  
Дата: 27.01.12 07:34
Оценка:
Здравствуйте, Doc, Вы писали:

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


З>>Алгоритмы должны быть известны контроллеру (под известны я подразумеваю, что либо реализованы в нем, либо делегированы). Этот же контроллер обновляет графическое представление при изменении модели.


Doc>Бизнес-логика в контроллере? Это что за шаблон используется


Нет, вся бизнес-логика находится в стороннем классе. Контроллер осуществляет лишь общее взаимодействие. Например, при добавлении нового элемента в модель мы используем метод контроллера AddElement, который добавляет элемент в модель, а затем обновляет графическое представление через класс-построитель. Модель должна быть макисмально чистой из-за того, что используется в том числе для экспорта и сохранения в виде Xml.

Doc>Затем чуствуется в этой логике дыра. Вы изначально используете абстракцию, но потом приводите к конкоретным реализациям.


Ну а как иначе? У меня модель любого типа может ссылаться на модель любого типа через коннекторы.

Doc>Ну а по теме — вроде само логичное тут enum. Но я бы все же пересмотрел архитектуру.


enum, конечно, предпочтительное, но это похоже на выбор наименьшего дерьма. Архитектура уже сто раз пересматривалась, более оптимального пути пока что не вижу.
Re[6]: Проблема с приведением типов
От: Злобастик  
Дата: 27.01.12 07:39
Оценка:
Здравствуйте, ksg71, Вы писали:

K>заведите "реестр" алгоритмов(стратегий)


K>
K>interface IRegistry<T> where T : ModelBase
K>{
K>    IStrategy Get(T model);
K>}
K>


K>реализацию постройте на базе словаря Type — IStrategy, где Type конкретный тип модели


Идея хорошая, но уж очень много точек в программе, которые используют разные алгоритмы для разных моделей. По сути получится так, что IStrategy придется реализовывать какому-то одному классу, в то время как они могут быть разбиты по разным классам.
Re: Проблема с приведением типов
От: Sharov Россия  
Дата: 27.01.12 07:41
Оценка:
Здравствуйте, Злобастик, Вы писали:

Чем 3 вариант Вам не приглянулся?
Кодом людям нужно помогать!
Re[2]: Проблема с приведением типов
От: Злобастик  
Дата: 27.01.12 07:41
Оценка:
Здравствуйте, hi_octane, Вы писали:

_>Если C#4, можно на динамиках:


_>
_>dynamic d = abstractInstance;

_>//динамик сам разрулит тип и вызовет нужный метод
_>ConcreteStrategy(d);

_>void ConcreteStrategy(ConcreteModel1 cm);
_>void ConcreteStrategy(ConcreteModel2 cm);
_>void ConcreteStrategy(ConcreteModel3 cm);


_>void ConcreteStrategy(AbstractModel am)
_>{
_>  throw new NotImplementedException("Нет стратегии для модели типа " + am.GetType().Name);
_>}
_>


Хм... Очень интересно. Спасибо за намек )
Re[7]: Проблема с приведением типов
От: ksg71 Германия  
Дата: 27.01.12 07:41
Оценка:
Здравствуйте, Злобастик, Вы писали:

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


K>>заведите "реестр" алгоритмов(стратегий)


K>>
K>>interface IRegistry<T> where T : ModelBase
K>>{
K>>    IStrategy Get(T model);
K>>}
K>>


K>>реализацию постройте на базе словаря Type — IStrategy, где Type конкретный тип модели


З>Идея хорошая, но уж очень много точек в программе, которые используют разные алгоритмы для разных моделей. По сути получится так, что IStrategy придется реализовывать какому-то одному классу, в то время как они могут быть разбиты по разным классам.


это почему? много реализаций, разными классами, собраны в реестр и т.д.
Das Reich der Freiheit beginnt da, wo die Arbeit aufhört. (c) Karl Marx
Re[2]: Проблема с приведением типов
От: Злобастик  
Дата: 27.01.12 07:42
Оценка:
Здравствуйте, Sharov, Вы писали:

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


S>Чем 3 вариант Вам не приглянулся?


Добавляет кучу юзкейсов, которые придется копипастить в разные методы.
Re[8]: Проблема с приведением типов
От: Злобастик  
Дата: 27.01.12 07:48
Оценка:
Здравствуйте, ksg71, Вы писали:

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


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


K>>>заведите "реестр" алгоритмов(стратегий)


K>>>
K>>>interface IRegistry<T> where T : ModelBase
K>>>{
K>>>    IStrategy Get(T model);
K>>>}
K>>>


K>>>реализацию постройте на базе словаря Type — IStrategy, где Type конкретный тип модели


З>>Идея хорошая, но уж очень много точек в программе, которые используют разные алгоритмы для разных моделей. По сути получится так, что IStrategy придется реализовывать какому-то одному классу, в то время как они могут быть разбиты по разным классам.


K>это почему? много реализаций, разными классами, собраны в реестр и т.д.


Да, я ступил. Тут ведь два интерфейса. Спасибо. Подумаю над этим.
Re[2]: Проблема с приведением типов
От: bessony  
Дата: 27.01.12 21:16
Оценка:
Здравствуйте, hi_octane, Вы писали:

З>>Задача выглядит тривиальной, но я за 10 лет ни с чем подобным не сталкивался. Может быть, есть какие-нибудь варианты элегантного решения?


_>Если C#4, можно на динамиках:


_>
_>dynamic d = abstractInstance;

_>//динамик сам разрулит тип и вызовет нужный метод
_>ConcreteStrategy(d);

_>void ConcreteStrategy(ConcreteModel1 cm);
_>void ConcreteStrategy(ConcreteModel2 cm);
_>void ConcreteStrategy(ConcreteModel3 cm);


_>void ConcreteStrategy(AbstractModel am)
_>{
_>  throw new NotImplementedException("Нет стратегии для модели типа " + am.GetType().Name);
_>}
_>


_>В более старых C# можно двойной диспетчеризацией.


_>Ну и само собой лучше всего на Nemerle


А как с производительностью в данном варианте?
Re[3]: Проблема с приведением типов
От: hardcase Пират http://nemerle.org
Дата: 28.01.12 09:12
Оценка:
Здравствуйте, bessony, Вы писали:

B>А как с производительностью в данном варианте?


Вам интересно? Измерьте!
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: Бенчмарк DLR
От: hardcase Пират http://nemerle.org
Дата: 28.01.12 10:34
Оценка: 1 (1) +1
Здравствуйте, bessony, Вы писали:

B>А как с производительностью в данном варианте?


Бенчмарк DLR для случая топикстартера.

Количество вызовов (диспетчеризаций): 1 000 000.
Количество моделей: от 2 до 30.

Результаты (сперва DLR, затем цепочка if-ов)
Test 2:         00:00:00.1501894                00:00:00.0127041
Test 3:         00:00:00.1807162                00:00:00.0146960
Test 4:         00:00:00.2172946                00:00:00.0167803
Test 5:         00:00:00.2566256                00:00:00.0179131
Test 6:         00:00:00.2932858                00:00:00.0187023
Test 7:         00:00:00.2979244                00:00:00.0196321
Test 8:         00:00:00.3242752                00:00:00.0211403
Test 9:         00:00:00.3320123                00:00:00.0219701
Test 10:                00:00:00.3653084                00:00:00.0225925
Test 11:                00:00:00.4333419                00:00:00.0234339
Test 12:                00:00:00.4874044                00:00:00.0242877
Test 13:                00:00:00.5334538                00:00:00.0255024
Test 14:                00:00:00.5837708                00:00:00.0260052
Test 15:                00:00:00.6210437                00:00:00.0266966
Test 16:                00:00:00.6607010                00:00:00.0279926
Test 17:                00:00:00.6698717                00:00:00.0284594
Test 18:                00:00:00.7256114                00:00:00.0292975
Test 19:                00:00:00.7611713                00:00:00.0305656
Test 20:                00:00:00.8009269                00:00:00.0310508
Test 21:                00:00:00.8917549                00:00:00.0317411
Test 22:                00:00:00.8400355                00:00:00.0322965
Test 23:                00:00:00.8469869                00:00:00.0334863
Test 24:                00:00:00.8708858                00:00:00.0342951
Test 25:                00:00:00.9246261                00:00:00.0351796
Test 26:                00:00:00.9296106                00:00:00.0355774
Test 27:                00:00:00.9462336                00:00:00.0362442
Test 28:                00:00:00.9989730                00:00:00.0372382
Test 29:                00:00:01.0061178                00:00:00.0387295
Test 30:                00:00:01.0659175                00:00:00.0393628

Время охватывает диспетчеризацию всего набора объектов (т.е. 1 000 000 вызовов).

Для DLR измеряется:
dynamic d = x;
ConcreteStrategy(d);


Для статического кода измеряется:
if(x is ConcreteModel1)
    ConcreteStrategy((ConcreteModel1) x);
else
if(x is ConcreteModel2)
    ConcreteStrategy((ConcreteModel2) x);
else
    ConcreteStrategy(x);

Номер теста соответствует количеству if-ов.

Код T4:
[spoil]
<#@ template language="C#" #>
using System;
using System.Linq;
using System.Diagnostics;
using System.Runtime.CompilerServices;

<# const int modelsCount = 30; #>
<# const int repeatsCount = 1000000; #>

abstract class AbstractModel
{
}

<# for (var i = 1; i <= modelsCount; ++i) { #>
sealed class ConcreteModel<#= i #> : AbstractModel
{
}
<# } #>


<# for (var j = 2; j <= modelsCount; ++j)  { #>
static class Test<#= j #>
{
    [MethodImpl(MethodImplOptions.NoInlining)]
    private static void ConcreteStrategy(AbstractModel model)
    {
        Debug.Assert(false);
    }

<# for (var i = 1; i <= j; ++i) { #>
    [MethodImpl(MethodImplOptions.NoInlining)]
    private static void ConcreteStrategy(ConcreteModel<#= i #> model)
    {
    }
<# } #>

    public static void Run()
    {
        var random = new Random(<#= j * 100 #>);
        var data = new AbstractModel[<#= repeatsCount #>];
        for(var i = 0; i < data.Length; ++i)
            data[i] = Utils.CreateModel(random.Next(<#= j #>));
        Utils.Measure("Test <#= j #>", data,
        x =>
        {
            dynamic d = x;
            ConcreteStrategy(d);
        },
        x =>
        {
<# for (var i = 1; i <= j; ++i) { #>
            if(x is ConcreteModel<#= i #>)
                ConcreteStrategy((ConcreteModel<#= i #>) x);
            else
<# } #>
            ConcreteStrategy(x);
        });
    }
}
<# } #>

static class Program
{
    static void Main(string[] args)
    {
<# for (var j = 2; j <= modelsCount; ++j)  { #>
        Test<#= j.ToString() #>.Run();
<# } #>
    }
}

static class Utils
{
    static Utils()
    {
        _modelCtors = new Func<AbstractModel>[]
        {
<# for (var i = 1; i <= modelsCount; ++i) { #>
            () => new ConcreteModel<#= i #>(),
<# } #>
        };
    }

    public static void Measure(string title, AbstractModel[] data, Action<AbstractModel> a, Action<AbstractModel> b)
    {
        a(data[0]);
        b(data[0]);

        var timer = Stopwatch.StartNew();
        foreach(var x in data)
            a(x);
        var aTime = timer.Elapsed;
        timer.Restart();
        foreach(var x in data)
            b(x);
        var bTime = timer.Elapsed;
        Console.WriteLine("{0}:\t\t{1}\t\t{2}", title, aTime, bTime);
    }

    public static AbstractModel CreateModel(int number)
    {
        return _modelCtors[number]();
    }

    private static Func<AbstractModel>[] _modelCtors;
}
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: Бенчмарк DLR
От: bessony  
Дата: 28.01.12 11:38
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, bessony, Вы писали:


B>>А как с производительностью в данном варианте?


H>Бенчмарк DLR для случая топикстартера.


H>Количество вызовов (диспетчеризаций): 1 000 000.

H>Количество моделей: от 2 до 30.

H>Результаты (сперва DLR, затем цепочка if-ов)

H>
H>Test 2:         00:00:00.1501894                00:00:00.0127041
H>Test 3:         00:00:00.1807162                00:00:00.0146960
H>Test 4:         00:00:00.2172946                00:00:00.0167803
H>Test 5:         00:00:00.2566256                00:00:00.0179131
H>Test 6:         00:00:00.2932858                00:00:00.0187023
H>Test 7:         00:00:00.2979244                00:00:00.0196321
H>Test 8:         00:00:00.3242752                00:00:00.0211403
H>Test 9:         00:00:00.3320123                00:00:00.0219701
H>Test 10:                00:00:00.3653084                00:00:00.0225925
H>Test 11:                00:00:00.4333419                00:00:00.0234339
H>Test 12:                00:00:00.4874044                00:00:00.0242877
H>Test 13:                00:00:00.5334538                00:00:00.0255024
H>Test 14:                00:00:00.5837708                00:00:00.0260052
H>Test 15:                00:00:00.6210437                00:00:00.0266966
H>Test 16:                00:00:00.6607010                00:00:00.0279926
H>Test 17:                00:00:00.6698717                00:00:00.0284594
H>Test 18:                00:00:00.7256114                00:00:00.0292975
H>Test 19:                00:00:00.7611713                00:00:00.0305656
H>Test 20:                00:00:00.8009269                00:00:00.0310508
H>Test 21:                00:00:00.8917549                00:00:00.0317411
H>Test 22:                00:00:00.8400355                00:00:00.0322965
H>Test 23:                00:00:00.8469869                00:00:00.0334863
H>Test 24:                00:00:00.8708858                00:00:00.0342951
H>Test 25:                00:00:00.9246261                00:00:00.0351796
H>Test 26:                00:00:00.9296106                00:00:00.0355774
H>Test 27:                00:00:00.9462336                00:00:00.0362442
H>Test 28:                00:00:00.9989730                00:00:00.0372382
H>Test 29:                00:00:01.0061178                00:00:00.0387295
H>Test 30:                00:00:01.0659175                00:00:00.0393628
H>

H>Время охватывает диспетчеризацию всего набора объектов (т.е. 1 000 000 вызовов).

H>Для DLR измеряется:

H>
H>dynamic d = x;
H>ConcreteStrategy(d);
H>


H>Для статического кода измеряется:

H>
H>if(x is ConcreteModel1)
H>    ConcreteStrategy((ConcreteModel1) x);
H>else
H>if(x is ConcreteModel2)
H>    ConcreteStrategy((ConcreteModel2) x);
H>else
H>    ConcreteStrategy(x);
H>

H>Номер теста соответствует количеству if-ов.

H>Код T4:

H>[spoil]
H>
H><#@ template language="C#" #>
H>using System;
H>using System.Linq;
H>using System.Diagnostics;
H>using System.Runtime.CompilerServices;

H><# const int modelsCount = 30; #>
H><# const int repeatsCount = 1000000; #>

H>abstract class AbstractModel
H>{
H>}

H><# for (var i = 1; i <= modelsCount; ++i) { #>
H>sealed class ConcreteModel<#= i #> : AbstractModel
H>{
H>}
H><# } #>


H><# for (var j = 2; j <= modelsCount; ++j)  { #>
H>static class Test<#= j #>
H>{
H>    [MethodImpl(MethodImplOptions.NoInlining)]
H>    private static void ConcreteStrategy(AbstractModel model)
H>    {
H>        Debug.Assert(false);
H>    }

H><# for (var i = 1; i <= j; ++i) { #>
H>    [MethodImpl(MethodImplOptions.NoInlining)]
H>    private static void ConcreteStrategy(ConcreteModel<#= i #> model)
H>    {
H>    }
H><# } #>

H>    public static void Run()
H>    {
H>        var random = new Random(<#= j * 100 #>);
H>        var data = new AbstractModel[<#= repeatsCount #>];
H>        for(var i = 0; i < data.Length; ++i)
H>            data[i] = Utils.CreateModel(random.Next(<#= j #>));
H>        Utils.Measure("Test <#= j #>", data,
H>        x =>
H>        {
H>            dynamic d = x;
H>            ConcreteStrategy(d);
H>        },
H>        x =>
H>        {
H><# for (var i = 1; i <= j; ++i) { #>
H>            if(x is ConcreteModel<#= i #>)
H>                ConcreteStrategy((ConcreteModel<#= i #>) x);
H>            else
H><# } #>
H>            ConcreteStrategy(x);
H>        });
H>    }
H>}
H><# } #>

H>static class Program
H>{
H>    static void Main(string[] args)
H>    {
H><# for (var j = 2; j <= modelsCount; ++j)  { #>
H>        Test<#= j.ToString() #>.Run();
H><# } #>
H>    }
H>}

H>static class Utils
H>{
H>    static Utils()
H>    {
H>        _modelCtors = new Func<AbstractModel>[]
H>        {
H><# for (var i = 1; i <= modelsCount; ++i) { #>
H>            () => new ConcreteModel<#= i #>(),
H><# } #>
H>        };
H>    }

H>    public static void Measure(string title, AbstractModel[] data, Action<AbstractModel> a, Action<AbstractModel> b)
H>    {
H>        a(data[0]);
H>        b(data[0]);

H>        var timer = Stopwatch.StartNew();
H>        foreach(var x in data)
H>            a(x);
H>        var aTime = timer.Elapsed;
H>        timer.Restart();
H>        foreach(var x in data)
H>            b(x);
H>        var bTime = timer.Elapsed;
H>        Console.WriteLine("{0}:\t\t{1}\t\t{2}", title, aTime, bTime);
H>    }

H>    public static AbstractModel CreateModel(int number)
H>    {
H>        return _modelCtors[number]();
H>    }

H>    private static Func<AbstractModel>[] _modelCtors;
H>}
H>



То есть все таки влияет. Спасибо за информацию!
И кстати as в цепочке if-ов работал бы быстрее чем is.
Re[5]: Бенчмарк DLR
От: hardcase Пират http://nemerle.org
Дата: 28.01.12 13:53
Оценка:
Здравствуйте, bessony, Вы писали:

B>И кстати as в цепочке if-ов работал бы быстрее чем is.


Однако мне не верится в это По моему опыту забегов ncc.exe скорость их равна — JIT компилятор достаточно умен чтобы оптимизировать тестирование типа и последующее приведение к нему.
/* иЗвиНите зА неРовнЫй поЧерК */
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.