Замечания и предложения

Нет. Память, которую он контролирует. Она является неперемещаемой и не собирается сборщиком мусора

Да. Но на короткий срок. Такую память надо специально фиксировать чтобы сборщик мусора её не переместил. И это сказывается на производительности если Вы её не расфиксировали. Хотя в этот момент - да - обращение к Bitmap - быстрое. Но это - крайне редкая операция. Вот как раз для работы с Bitmap :slight_smile:

1 лайк

Вот видите! Но операция эта не такая уж и редкая. Например, если заниматься обработкой изображений… :slight_smile: Хотя у меня, сколько работаю, ни разу не было никаких конфликтов со сборщиком, хотя я вызывал его регулярно после того, как массив оказывался ненужным и ему присваивался nil. Возможно, в теории, Вы и правы, но на практике всё получается иначе.

6 сообщений перенесены в тему Болталка PascalABC.NET

Я говорю об общем количестве issure и, кстати, пост был именно в связи с очередной “хотелкой”. Среди тех хотелок есть совершенно неравноценные по востребованности: одни - это вещи, нужные единицам, другие же могут “скрасить жизнь” тысячам. Но и те и другие - “хотелки”.

Это не работает:

program pr1;

[System.STAThreadAttribute]
begin
  
end.

Предлагаю разрешить писать код сверху. При чём атрибут должен применяться к обоим генерируемым Main, потому что STAThread игнорируется если стоит не в точке входа в программу, а, к примеру, MarshalAs сработает не так как ожидалось, если прикрепить его только к точке входа.

А что там скрасит жизнь тысячам?

Например, срезы матриц, без которых во многих задачах сейчас приходится городить огород из процедур. Или недавно предложенная распаковка кортежа в циклах foreach.

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

begin
  var s:='Карл у Клары украл кораллы Клара у Карла украла кларнет';
  var a:=s.ToWords.Select(t->(t,t.Length)).ToArray;
  //a.Println;
  var imax:=a.Select(t->t[1]).ToArray.IndexMax;
  Writeln('Первое из самых длинных слов; ',a[imax][0])
end.

А предложите что то лучше

.Select(t->t[1]).ToArray.IndexMax лучше заменить на .MaxBy(t->t[1])[0]. И быстрее и короче. И в пользе от первого .ToArray я очень не уверен. Заменить бы хотя бы на .ToList - уже немного лучше будет. Правда, на столько лучше по производительности, сколько и по длине)). Но вроде его можно и полностью убрать, пока .Println закомментированно - будет работать не медленнее.

Хм… Забавно, о каких тысячах вы говорите?! Где они, ау-у-у! Давайте ради объективности проведем эксперимент – поставим здесь голосовалку и пересчитаем всех, кто добровольно использует этот паскаль в работе и жизни, хотя бы время от времени. Обычные школьники и студенты, вынужденные на нем учиться по программе, не в счет! Абсолютное большинство из них забудут про него, как только покинут свои альма-матер.

@admin Давайте попробуем посчитать только тех, кто реально интересуется сабжем. Самому стало интересно, каков же реальный размер комьюнити (т.е. хотя бы тех, кто иногда почитывает этот форум)? Предположу, что не более 40-50 чел. – я сегодня оптимист!

1 лайк

Это похоже. Так и система - для студентов и школьников преимущественно. В продакшне её позиционирование непонятно. Может использоваться для научных расчётов и чтобы быстро что-то попробовать.

Ну как это не в счёт. Для них и писалось. Их десятки тысяч.

Давайте вот ещё Вас вычеркнем по какой-то причине :slight_smile: и тоже скажем “не в счёт” :slight_smile:

1 лайк

Я думаю, счет идет не на десятки, а на сотни тысяч. Часть свободного времени провожу на бесплатном ресурсе “Знания”, имеющем более 100 млн (!) посещений в сутки и абсолютное большинство школьников и студентов-младшекурсников России, Украины, Белоруссии и Казахстана просят что-то решить на “PascalABC” (который на поверку оказывается все-таки PascalABC.NET), либо на PascalABC.NET, Другое дело, что они почти поголовно все еще используют подмножество языка “Турбо Паскаль”, но и за решения в функциональном стиле не забывают сказать “спасибо”.

А давайте проведем аналогию между обучением и выводом спутника на орбиту. Много ли спутник, находясь уже “там”, думает о ступенях ракеты-носителя, которые его на эту орбиту вывели и потом были отброшены? Так что, эти ступени делать не надо было или надо было делать кое-как? PascalABC.NET - и это написано - трамплин к С# и ключ к современным технологиям программирования, обёрнутый в простой, четкий и понятный синтаксис языка Pascal.

Да, наверно это лучше.

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

:slight_smile: Можете вычеркивать, но учтите:

Пять негритят судейство учинили,
Засудили одного, осталось их четыре. 
4 программиста работали на Си,
Один из них хвалил Паскаль, и их осталось 3. 
begin
  var s := 'Карл у Клары украл кораллы Клара у Карла украла кларнет';
  var el := s.ToWords.Select(t -> (t, t.Length)).MaxBy(t2 -> t2[1])[0];
  Writeln($'Первое из самых длинных слов: {el}');
end.

А зачем вообще массив, если вся последовательность перебирается только 1 раз?

P.S. а вообще кортежи тут не сдались

begin
  var s := 'Карл у Клары украл кораллы Клара у Карла украла кларнет';
  var el := s.ToWords.MaxBy(w -> w.Length);
  Writeln($'Первое из самых длинных слов: {el}');
end.

А я не понимаю, зачем тут вообще не только 2 доп. последовательности и 2 массива, но еще и кортеж в них:

begin
  var s:='Карл у Клары украл кораллы Клара у Карла украла кларнет';  
  writeln('Первое из самых длинных слов: ', s.ToWords.MaxBy(t->t.Length));
end.

P.S. Серега опередил меня, пока я сочинял ответ про школу :slight_smile:

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

<значение> <количество_повторов> [строка,столбец] [строка,столбец] …

procedure RunWithArray;
begin
  
  var s := 'Карл у Клары украл кораллы Клара у Карла украла кларнет';
  
  var ws := s.ToWords.ToArray;
  
  var max_l := ws.Max(w->w.Length);
  var max_l_ws := ws.Where(w->w.Length=max_l);
  foreach var w in max_l_ws do;
  
  s := ws.Where(w->(w.Length=max_l) or (w.Length < 4)).JoinIntoString;
  
end;

procedure RunWithoutArray;
begin
  
  var s := 'Карл у Клары украл кораллы Клара у Карла украла кларнет';
  
  var ws := s.ToWords;//эта строчка единственное различие
  
  var max_l := ws.Max(w->w.Length);
  var max_l_ws := ws.Where(w->w.Length=max_l);
  foreach var w in max_l_ws do;
  
  s := ws.Where(w->(w.Length=max_l) or (w.Length < 4)).JoinIntoString;
  
end;

begin
  
  var c := 1000*1000;
  var t:System.DateTime;
  
  t := System.DateTime.Now;
  loop c do RunWithArray;
  var ts1 := System.DateTime.Now-t;
  
  t := System.DateTime.Now;
  loop c do RunWithoutArray;
  var ts2 := System.DateTime.Now-t;
  
  writeln($'time 1 is {ts1}');
  writeln($'time 2 is {ts2}');
  readln;
  
end.

У меня выдаёт соответственно 4 и 3.4 сек. Потому что лишние 2 раза посчитать .ToWords проще чем создавать массив (у массива очень не эффективный код заполнения, а .ToWords находит в строке координаты всех слов и копирует их).

А что касается кортежей - я редко встречал оправданное их использование. И когда встречал - чаще всего функциональное решение было ужасно медленным.

///Преобразует строку в массив слов
function ToWords(Self: string; params delim: array of char): array of string; extensionmethod; 

Сергей, оба ваших решения используют массивы, только в 1-м случае происходит создание и копирование данных лишнего массива. Отсюда и разница во времени.

1 лайк

Да, мы знаем масштабы. Нас скачивают 3000 раз в день и уже скачали 3 млн. раз с момента начала проекта. Понятное дело - заставляют.

2 лайка