Кортежи ValueTuple

Предлагаю обсудить возможность добавления поддержки в язык кортежей System.ValueTuple<T, T2, …>. Это сыграло бы в плане оптимизации приложений, написанных в PascalABC.Net, положительную роль.

В этих Issue выяснилось, что в данный момент System.ValueTuple<T, T2, …> - не является кортежем с точки зрения компилятора.

1 лайк

Говорили уже об этом. Даже тема есть.

Да, нашел. Но, все-же предлагаю попытаться пересмотреть данное решение.

@Admin сказал:

Проблема в том, что мы поддерживаем .NET 4.0, а там еще и в помине не было кортежей ValueTuple.

, но в чём причина отказа начать поддерживать более свежие версии .Net Framework?

1 лайк

Причина в том, что под Win XP нельзя поставить что-то свежЕе 4.0. А WinXP пользуются в школах процентов на 40 по нашим подсчетам.

Кроме того, я еще раз обращаю ваше внимание, что в VS в режиме по умолчанию кортежей нет. Это значит, что у них с этим какие-то сложности.

А пруфлинки можете привести?

1 лайк

Доказательство здесь. В заголовке сказано, что это структура. Это, в свою очередь означает, что множество мелких кортежей - ValueTuple не так сильно ударят по производительности, как если бы они были классами.

Вот. Приведите код это доказывающий. Может, выигрыш копеечный

uses System.Diagnostics;

const
  TuplesCount = 100000; 
  TestsCount = 10000;

procedure Pass(a, b: integer);
begin
end;

procedure TestT();
begin
  loop TuplesCount do 
  begin
    var inst := new System.Tuple<integer, integer>(1, 1); 
    Pass(inst.Item1, inst.Item2);
  end;
end;

procedure TestVT();
begin
  loop TuplesCount do 
  begin
    var inst := new System.ValueTuple<integer, integer>(1, 1); 
    Pass(inst.Item1, inst.Item2);
  end;
end;

begin
  var tim := Stopwatch.StartNew(); 
  loop TestsCount do 
    TestT(); 
  tim.Stop(); 
  Println('Tuples =', tim.ElapsedMilliseconds / 1000); 
  tim.Restart(); 
  loop TestsCount do 
    TestVT(); 
  tim.Stop(); 
  Println('ValueTuples =', tim.ElapsedMilliseconds / 1000); 
end.

Результаты:

Tuples = 14.104 
ValueTuples = 11.637

При однократном вызове выигрыш составляет 30 наносекунд. Крайне существенный выигрыш, учитывая, что миллиарды раз кортежи никто не станет создавать даже в горячечном бреду.

14.104 - 11.637 = 2.467 с. Округлим даже до 3 с. В одном тесте цикл содержит 10^5 созданий кортежа и столько же обращений к нему. Тест выполняется 10^3 раз. Итого, кортеж создается и вызывается 10^5 * 10^3 = 10^8 раз. Тогда на один проход в теле цикла затрачивается 3 / 10^8 = 3*10^(-8) c или 30 * 10^(-9)c, что составляет 30 наносекунд. Или 0.03 микросекунды.

@RAlex, кортежи используются в файлах .obj. Насколько помню, там каждая вершина является кортежем из трёх элементов, причём именно ValueTuple, а не Tuple. Как Вы думаете почему выбрали именно первый тип кортежей, а не второй? Если судить по Вашему посту, то это можно счесть ошибочным решением, ведь, по Вашему мнению никто множество кортежей не будет делать.

Вообще, мы об этом думали несомненно. Думали даже написать свой valuetuple на паскале.

Надо понимать, что мы в одном месте выиграем производительность 25%. Для промышленного применения это существенно. Для ниши Pascalabc.net это не первоочередное, хотя имиджевое конечно.

Представим себе, что мы сделали кортежи на базе valuetuple. Школьник берет эту программу, компилирует, переносит на комп друга и там она падает. Вуаля.

Потом находится какой то бешеный представитель с киберфорума, пишет очередную статью на хабре, что у них элементарные кортежи не работают и падают. Вуаля.

Где выгода? Нигдеине работает, но если работает, то на 25% быстрее. Круто.

1 лайк

Никто Вам не мешает сделать это в удобное для Вас время.

Такой вариант, как обновить .Net Framework уже не рассматривается?

Но это никак не повод отвергать эту идею. Это лишь повод ему разобраться в возникшей ситуации. Проблемы со спамом решаются просто - спам удаляется. Если же этого во время не предприняли, это уже не вина разработчиков, а вина администрации, на сайте которой был размещен спам.

Нет конечно. Как Вы это себе представляете? На чужом компьютере программа склеит ласты при запуске. Какой школьник догадается что что то надо обновлять? Просто выкинут и скажут, что это гадость. И будут правы.

2 лайка

Нет. Не будут, если указывать какая версия .Net Framework требуется для запуска программ в данной версии PascalABC.Net. Тогда никаких претензий к Вам не будет от таких пользователей. Мнение о том, что современный школьник не способен обновить .Net Framework - это ошибочное мнение.

Если я правильно помню, под WinXP и так уже не работает GrapfWPF ? Я когда-то пытался оттуда что-то запустить под WinXP и Вы еще писали, что уровень .NET-библиотеки не позволяет. Или это не WPF был… но точно что-то из ABC-графики. Но то ладно - пакет. А если перестанут работать кортежи… а они почти везде уже - это будет армагеддец.

1 лайк

Я уже говорил о способе решения этой проблемы выше.

Да, я читал это - спасибо за совет

Под WinXP ляжет всё потому что стандартный модуль насыщен кортежами

Это если перейти на ValueTuple. Я потому и написал, что это будет армагеддец. Армагеддон локального масштаба. Обычные кортежи ведь сейчас работают под WinXP.