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