Доказательство здесь. В заголовке сказано, что это структура. Это, в свою очередь означает, что множество мелких кортежей - 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.
При однократном вызове выигрыш составляет 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% быстрее. Круто.
Но это никак не повод отвергать эту идею. Это лишь повод ему разобраться в возникшей ситуации. Проблемы со спамом решаются просто - спам удаляется. Если же этого во времяне предприняли, это уже не вина разработчиков, а вина администрации, на сайте которой был размещен спам.
Нет конечно. Как Вы это себе представляете? На чужом компьютере программа склеит ласты при запуске. Какой школьник догадается что что то надо обновлять? Просто выкинут и скажут, что это гадость. И будут правы.
Нет. Не будут, если указывать какая версия .Net Framework требуется для запуска программ в данной версии PascalABC.Net. Тогда никаких претензий к Вам не будет от таких пользователей. Мнение о том, что современный школьник не способен обновить .Net Framework - это ошибочное мнение.
Если я правильно помню, под WinXP и так уже не работает GrapfWPF ? Я когда-то пытался оттуда что-то запустить под WinXP и Вы еще писали, что уровень .NET-библиотеки не позволяет. Или это не WPF был… но точно что-то из ABC-графики. Но то ладно - пакет. А если перестанут работать кортежи… а они почти везде уже - это будет армагеддец.
Это если перейти на ValueTuple. Я потому и написал, что это будет армагеддец. Армагеддон локального масштаба. Обычные кортежи ведь сейчас работают под WinXP.
Знаете, меня, например, бесят новости, что новое железо/программы прекращают поддержку Win7 и требуют 8, 8.1 и 10. Мне проще не использовать это или искать нелегальные портированные версии. Тут - то же самое. На XP нельзя поставить что-то старше 4.0, во всяком случае без шаманства, но время идёт и место XP может занять семёрка. Так что я поступлю так:
Верно, но не всегда можно её обновить. Вот выйдет, скажем, .NET 8 версии без поддержки 7 и всё. Многие не хотят ставить что - то новее 7. А ничего, что за это ещё и платить надо. За копию. Вы ведь не хотите вирусов, нам подслушки и от РКН хватает за глаза.
Конечно, в компьютерном классе школы, к примеру. Там что сочли нужным поставить, то и стоит. Может, железо старое и не позволяет перейти на семерку даже. Или какие-то учебные программы, которые не работают на семерке из-за ограниченной поддержки ей DOS-режима.