Типизированный Iterator
От: V.Petrovski Беларусь  
Дата: 01.03.05 08:33
Оценка:
Читая статью "Элегантный код на основе анонимных методов, итераторов и частичных классов" моё внимание привлекла фраза

C# 1.0 позволяет реализовать шаблон итератора для каждого цикла без IEnumerator или IEnumerable, хотя о такой возможности большинство разработчиков не знает. Тогда компилятор будет вызывать строго типизированную версию, не прибегая к приведению типов и упаковке. Так что даже в версии 1.0 можно избежать снижения производительности.


Я взглянул в спецификацию языка и нашел описание этой возможности

To iterate through a collection, the collection must meet specific requirements. For example, in the following foreach statement:

foreach (ItemType item in myCollection)


myCollection must meet the following requirements:

The collection type:
    1. Must be one of the types: interface, class, or struct.
    2. Must include an instance method named GetEnumerator that returns a type, for example, Enumerator (explained below).
The type Enumerator (a class or struct) must contain:
    1. A property named Current that returns ItemType or a type that can be converted to it. The property accessor returns the current element of the collection.
    2. A bool method, named MoveNext, that increments the item counter and returns true if there are more items in the collection.


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

using System;
using System.Collections;

namespace TypedEnumerator
{
    public class MyCollection/* : IEnumerable */
    {
        public int[] items;

        public MyCollection(int capacity) 
        {
            items = new int[capacity];
        }

        public MyEnumerator GetEnumerator() 
        {
            return new MyEnumerator(this.items);
        }
/*
        IEnumerator IEnumerable.GetEnumerator() 
        {
            return GetEnumerator();
        }
*/
        public class MyEnumerator/* : IEnumerator */
        {
            int i;
            int[] items;
            private int length;

            public DataObjCollection2Enumerator(int[] items) 
            {
                this.items = items;
                this.i = -1;
                this.length = items.Length;
            }

            public bool MoveNext() 
            {
                i++;
                return i < length;
            }

            public void Reset()
            {
                i = -1;
            }

            public int Current 
            {
                get 
                {
                    return items[i];
                }
            }
            /*
            object IEnumerator.Current 
            {
                get 
                {
                    return Current;
                }
            }
            */
        }
    }
}

Раскометировав все строки в этом примере мы добавим реализацию интерфейсов IEnumerable и IEnumerator но на производительности кода это никак не скажеться.

Хотя в спецификации C#1.0 написано, что такая колекция может использоваться только в языке C#, это ЛОЖЬ.
Такую колекцию можно использовать и в VB.NET.

Вот реpультаты пробега по колекциям в 1 миллион элементов типа Int32, при помощи их итераторов
на C#

int[]. Duration : 0,0029 sec
ArrayList. Duration : 0,0418 sec
MyCollectionBase. Duration : 0,0379 sec
MyCollection. Duration : 0,0144 sec

на VB.NET

int[]. Duration : 0,0029 sec
ArrayList. Duration : 0,0821 sec
MyCollectionBase. Duration : 0,0768 sec
MyCollection. Duration : 0,0148 sec


Как видите int[] и MyCollection работаю практически одинаково на двух языках, что не скажешь о ArraList и CollectionBase.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re: Типизированный Iterator
От: Mika Soukhov Stock#
Дата: 01.03.05 09:24
Оценка:
Здравствуйте, V.Petrovski, Вы писали:

VP>Вот реpультаты пробега по колекциям в 1 миллион элементов типа Int32, при помощи их итераторов

VP>на C#
VP>

VP>int[]. Duration : 0,0029 sec
VP>ArrayList. Duration : 0,0418 sec
VP>MyCollectionBase. Duration : 0,0379 sec
VP>MyCollection. Duration : 0,0144 sec

VP>на VB.NET
VP>

VP>int[]. Duration : 0,0029 sec
VP>ArrayList. Duration : 0,0821 sec
VP>MyCollectionBase. Duration : 0,0768 sec
VP>MyCollection. Duration : 0,0148 sec


VP>Как видите int[] и MyCollection работаю практически одинаково на двух языках, что не скажешь о ArraList и CollectionBase.


А ты смотрел IL? В чем там раздница?
Re[2]: Типизированный Iterator
От: V.Petrovski Беларусь  
Дата: 01.03.05 09:30
Оценка:
Здравствуйте, Mika Soukhov, Вы писали:

MS>А ты смотрел IL? В чем там раздница?

Конечно смотрел, а ты о какой разнице, между языками или между итераторами.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[3]: Типизированный Iterator
От: Mika Soukhov Stock#
Дата: 01.03.05 09:34
Оценка:
Здравствуйте, V.Petrovski, Вы писали:

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


MS>>А ты смотрел IL? В чем там раздница?

VP>Конечно смотрел, а ты о какой разнице, между языками или между итераторами.

Я о разнице в ИЛ. Из твоего сообщения я понял, что на VB тормозит. Так?
Re[4]: Типизированный Iterator
От: V.Petrovski Беларусь  
Дата: 01.03.05 09:51
Оценка:
Здравствуйте, Mika Soukhov, Вы писали:

MS>Я о разнице в ИЛ. Из твоего сообщения я понял, что на VB тормозит. Так?

Вообще-то я говорил про возможность создания на C#1.0 типизированного итератора,
который работает быстрее универсального IEnumerator.

А VB.NET здесь упомянут для того, что бы показать что такие итераторы можно использовать и в VB.NET

То что VB.NET тормознее чем C# это и так понятно.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[5]: Типизированный Iterator
От: Mika Soukhov Stock#
Дата: 01.03.05 10:00
Оценка: +1
Здравствуйте, V.Petrovski, Вы писали:

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


MS>>Я о разнице в ИЛ. Из твоего сообщения я понял, что на VB тормозит. Так?

VP>Вообще-то я говорил про возможность создания на C#1.0 типизированного итератора,
VP>который работает быстрее универсального IEnumerator.

А где тесты то? Я вижу только результаты сравнени языков

VP>А VB.NET здесь упомянут для того, что бы показать что такие итераторы можно использовать и в VB.NET


Понятно. В данном топике описано две проблемы (можно было бы и разбить на отдельные сообщения ). Я этого не увидел.
Re[6]: Типизированный Iterator
От: V.Petrovski Беларусь  
Дата: 01.03.05 12:11
Оценка:
Здравствуйте, Mika Soukhov, Вы писали:

MS>А где тесты то? Я вижу только результаты сравнени языков

Вот здесь я выложил тесты.

MS>Понятно. В данном топике описано две проблемы (можно было бы и разбить на отдельные сообщения ). Я этого не увидел.

Описана одна проблема — "Как сделать типизированный Итераторов с минимальными потерями производительности".

Лучше бы я про VB вообще ничего не говорил Просто приву еще раз свою цитату.

Хотя в спецификации C#1.0 написано, что такая колекция может использоваться только в языке C#, это ЛОЖЬ.
Такую колекцию можно использовать и в VB.NET.

... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[7]: Типизированный Iterator
От: Mika Soukhov Stock#
Дата: 01.03.05 17:52
Оценка:
Здравствуйте, V.Petrovski, Вы писали:

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


MS>>А где тесты то? Я вижу только результаты сравнени языков

VP>Вот здесь я выложил тесты.

Не. Смотреть не интересно, ты лучше сам объясняй.

MS>>Понятно. В данном топике описано две проблемы (можно было бы и разбить на отдельные сообщения ). Я этого не увидел.

VP>Описана одна проблема — "Как сделать типизированный Итераторов с минимальными потерями производительности".

И почему такой выигрыш у типизированных итераторов? Или ты спрашиваешь?

VP>Лучше бы я про VB вообще ничего не говорил


Правильно. Надо четко выделять проблему, а не лить воду.

VP>Просто приву еще раз свою цитату.

VP>

VP>Хотя в спецификации C#1.0 написано, что такая колекция может использоваться только в языке C#, это ЛОЖЬ.
VP>Такую колекцию можно использовать и в VB.NET.


Из данного сообщения я понял, что ты научился создавать типизированные итераторы на ВБ.
Re: Типизированный Iterator
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 01.03.05 18:18
Оценка:
Здравствуйте, V.Petrovski, Вы писали:

http://gzip.rsdn.ru/article/dotnet/collections.xml#EFHA
Автор(ы): Владислав Чистяков (VladD2)
Дата: 24.06.2004
Рассказ о коллекциях в .NET Framework. Статья будет полезна как начинающим программистам, так и желающим более подробно изучить этот вопрос.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
и солнце б утром не вставало, когда бы не было меня
Re[2]: Типизированный Iterator
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 01.03.05 18:28
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>http://gzip.rsdn.ru/article/dotnet/collections.xml#EFHA
Автор(ы): Владислав Чистяков (VladD2)
Дата: 24.06.2004
Рассказ о коллекциях в .NET Framework. Статья будет полезна как начинающим программистам, так и желающим более подробно изучить этот вопрос.

Это все трюки с проинлайниванием кода как с массивами когда тип известен на этапе компиляции.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
и солнце б утром не вставало, когда бы не было меня
Re[8]: Типизированный Iterator
От: V.Petrovski Беларусь  
Дата: 02.03.05 07:25
Оценка:
Здравствуйте, Mika Soukhov, Вы писали:

MS>Не. Смотреть не интересно, ты лучше сам объясняй.


Нет, Уж будьте так любезны сами.

MS>Из данного сообщения я понял, что ты научился создавать типизированные итераторы на ВБ.

У тебя что нет разницы между словами использовать и создавать?
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[5]: Типизированный Iterator
От: Andrbig  
Дата: 02.03.05 13:05
Оценка:
Здравствуйте, V.Petrovski, Вы писали:

VP>То что VB.NET тормознее чем C# это и так понятно.


Твои собственные тесты этого не подтверждают.

Хороший хирург поможет плохому танцору (январь 2005).
Re[6]: Типизированный Iterator
От: V.Petrovski Беларусь  
Дата: 02.03.05 14:24
Оценка:
Здравствуйте, Andrbig, Вы писали:

A>Твои собственные тесты этого не подтверждают.


Мой опыт об этом говорит, и тесты тоже
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[7]: Типизированный Iterator
От: Andrbig  
Дата: 02.03.05 15:04
Оценка:
Здравствуйте, V.Petrovski, Вы писали:

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


A>>Твои собственные тесты этого не подтверждают.


VP>Мой опыт об этом говорит, и тесты тоже


VB:

MyVBCollection. Duration :   0.0185 sec
MyCollection. Duration :   0.0182 sec
MyVBCollection. Duration :   0.0184 sec
MyCollection. Duration :   0.0172 sec
MyVBCollection. Duration :   0.0172 sec
MyCollection. Duration :   0.0171 sec


CS:

int[]. Duration :   0.0030 sec
ArrayList. Duration :   0.0327 sec
MyCollectionBase. Duration :   0.0338 sec
MyCollection. Duration :   0.0180 sec
int[]. Duration :   0.0033 sec
ArrayList. Duration :   0.0346 sec
MyCollectionBase. Duration :   0.0323 sec
MyCollection. Duration :   0.0169 sec
int[]. Duration :   0.0027 sec
ArrayList. Duration :   0.0321 sec
MyCollectionBase. Duration :   0.0320 sec
MyCollection. Duration :   0.0182 sec


И где тут огромная разница?

VB предоставляет ряд возможностей для тормозов, надо их знать и в них не вляпаться, вот и все. Валить собственное незнание на язык — пионерство.
Re[8]: Типизированный Iterator
От: V.Petrovski Беларусь  
Дата: 02.03.05 15:34
Оценка: 4 (1)
Здравствуйте, Andrbig, Вы писали:

A>VB предоставляет ряд возможностей для тормозов, надо их знать и в них не вляпаться, вот и все. Валить собственное незнание на язык — пионерство.

Вот я про какие тормоза.

на C#

int[]. Duration : 0,0029 sec
ArrayList. Duration : 0,0418 sec
MyCollectionBase. Duration : 0,0379 sec
MyCollection. Duration : 0,0144 sec

на VB.NET

int[]. Duration : 0,0029 sec
ArrayList. Duration : 0,0821 sec
MyCollectionBase. Duration : 0,0768 sec
MyCollection. Duration : 0,0148 sec

... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[8]: Типизированный Iterator
От: V.Petrovski Беларусь  
Дата: 02.03.05 15:42
Оценка:
Здравствуйте, Andrbig, Вы писали:

A>И где тут огромная разница?


А чтобы тесты были одинаковыми, ты вынеси описание MyVBCollection в другую сборку.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[9]: Типизированный Iterator
От: Andrbig  
Дата: 03.03.05 08:16
Оценка:
Здравствуйте, V.Petrovski, Вы писали:

VP>А чтобы тесты были одинаковыми, ты вынеси описание MyVBCollection в другую сборку.


Вынес, действительно стал работать дольше. Потом я сделал то же самое и для C#. Результат — "супербыстрый" C# показал точно такое же время. Можешь проверить.

Так что пока я никаких реальных подтверждений тормознутости VB так и не увидел. Щас еще вот посмотрю про ArrayList...
Re[9]: Типизированный Iterator
От: Andrbig  
Дата: 03.03.05 08:26
Оценка:
Здравствуйте, V.Petrovski, Вы писали:

VP>Вот я про какие тормоза.


VP>на C#

VP>

VP>int[]. Duration : 0,0029 sec
VP>ArrayList. Duration : 0,0418 sec
VP>MyCollectionBase. Duration : 0,0379 sec
VP>MyCollection. Duration : 0,0144 sec

VP>на VB.NET
VP>

VP>int[]. Duration : 0,0029 sec
VP>ArrayList. Duration : 0,0821 sec
VP>MyCollectionBase. Duration : 0,0768 sec
VP>MyCollection. Duration : 0,0148 sec


Да, тормоза с ArrayList подтвердились. Такие же — в 2 раза. Ура, наконец хоть кто-то смог приложить к своим словам реальный пример тормознутости. Спасибо.
Re[10]: Типизированный Iterator
От: V.Petrovski Беларусь  
Дата: 03.03.05 09:05
Оценка:
Здравствуйте, Andrbig, Вы писали:

A>Вынес, действительно стал работать дольше.

A>Потом я сделал то же самое и для C#.
А зачем, объявление MyCollection и так находится в другом проекте.
A>Результат — "супербыстрый" C# показал точно такое же время.
Что-то я не понял сорказма
Ты почитай в моем первом посте последнее предложение

A>Щас еще вот посмотрю про ArrayList...

Почитал последнее предложение?
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.