Вверх ↑
Этот топик читают: Гость
Ответов: 9906
Рейтинг: 351
#46: 2014-06-25 14:16:58 ЛС | профиль | цитата
Assasin писал(а):
Для того, чтобы хранить размер реально выделенной под поток байт памяти. Использоваться может меньше, а выделяться больше. Это чтобы меньше использовать динамическое выделение.

Не смешите мои подковы.
Честное слово, я профессиональный Читатель. Читать - умею.
Вот карта использования этого FAlloced
#pas
constructor TProgram.Create;
...
FAlloced := 0;
...
end;
...
function TProgram.AllocMemIfNeeded(need:integer): boolean;
...
nsz := FAlloced;
...
if nsz <> FAlloced then begin
...
end;
...
procedure TProgram.Clear;
...
FreeMem(FPgm, FAlloced);
FPgm := nil;
FAlloced := 0;
end;
...
procedure TProgram.Truncate;
begin
if FUsed < FAlloced then begin
ReallocMem(FPgm, FUsed);
FAlloced := FUsed;
end;
end;
...
Видим, что ненулевое значение получается только при Truncate
Это называется "Оппа-аньки".
Я то, тупой, думал, что мне как-бы облегчили жизнь, сказавши, что мне надо лишь знать методы ReadXXX, WriteXXX, и Clear.
Оказывается не фига.
Есть еще Truncate
И мне следует произвести криминалистические исследования "а что это за девочка, и где она живет"

А если еще присмотреться, то условие в Truncate никогда не выполнится.

Но давай вспомним самый главный вопрос - НА ХРЕНА МНЕ ЭТИ РАЗБОРКИ.
Как впрочем, и всем остальным.

Сейчас вспомню
Assasin писал(а):
я как раз считаю, что делаю лучше, и что избавляюсь от проблем, которые возникнут

А по-моему, ты их создал.
Ибо лучшее средство от перхоти - гильотина
------------ Дoбавленo в 14.16:
Assasin писал(а):
А вот однажды смекалистый юзер такое применение найдет, что откроется бага в них

Про теорию я знаю.
Таковая инкапсуляция осуществляется, чтобы гарантировать реализацией методов сохранение некоторых инвариантов класса (например, некоторые логические соотношения между значениями его полей).
Которые смекалистый юзер сумеет нарушить без инкапсуляции.

ПОКАЖИ мне эти инварианты (условия).
Вспомни: "Не вводи новые сущности без необходимости".
Т.е., сначала НЕОБХОДИМОСТЬ, а потом - новая сущность.

Вот какого черта вы делаете (точнее - вас учат так делать) с точностью ДО НАОБОРОТ

карма: 9

0
Разработчик
Ответов: 4698
Рейтинг: 426
#47: 2014-06-25 15:33:05 ЛС | профиль | цитата
Чего-то не хватает в этой карте:
#pas
if nsz <> FAlloced then begin
ReallocMem(FPgm, nsz);
FAlloced := nsz; //вот эта строчка
end;
Без нее конечно смысла в FAloced нет.
------------ Дoбавленo в 14.51:
А, посмотрел архив поста - реально там ее нет. Видимо давно поправил и забыл перезалить Тогда разберусь до конца с оптимизацией и тогда уже сразу все перезалью.
------------ Дoбавленo в 15.07:
Galkov писал(а):
Но давай вспомним самый главный вопрос - НА ХРЕНА МНЕ ЭТИ РАЗБОРКИ.

Так обычно все разборки решаются написанием комментариев, поясняющих, что делает такая-то функция.
------------ Дoбавленo в 15.33:
По результатам тестов кстати получилось, что бесклассовый вариант работает быстрее где-то в 2 раза. Так что переделаю на него.
карма: 10
0
Ответов: 9906
Рейтинг: 351
#48: 2014-06-25 18:21:41 ЛС | профиль | цитата
Assasin писал(а):
Так обычно все разборки решаются написанием комментариев, поясняющих, что делает такая-то функция.

Вот опять ты не понял
Да могу я сам разобраться.
И ошибку исправить, коль скоро таковая приключится.

НЕ В ЭТОМ ДЕЛО.
А в том, что парадигма разработки неправильная.
Не сейчас надо сравнивать, кто кого быстрее. Это предмет научных изысканий, а не инженерной разработки.
Правильная (и я об этом уже писал), это ДО кодинга провести предварительный анализ направлений разработки.
На предмет соответствия конечной цели. В условиях наличия совершенно конкретных инструментов.
Обязательно нескольких. Например классовое/бесклассовое.
В качестве целей - эффективность в Run-Time (конечно же, в сравнении с интерфейсной эффективностью), и Понятность кодов (ибо работа Инженера, коллективная - по определению).
Плюс к этому утверждаю, что это не трудно. Если работать в правильной последовательности.
И не больно

И не "все разборки решаются написанием", есть значительно более эффективное средство.
Ибо сказано, что "лучшее средство от перхоти -- гильотина".
Подчеркну -- значительно более эффективное, чем то самое "обычно".

Пойиите, тут нет ничего личного. Просто я Вам излагаю концепцию, которой Вас в школе не научат


------------ Дoбавленo в 18.21:
Assasin писал(а):
По результатам тестов кстати получилось, что бесклассовый вариант работает быстрее где-то в 2 раза.

Странно Вы измеряете, однако
Вот я сказал - в пять раз.
Взял этот код
Эту схему.
Получил такие результаты
minitestgood.png
Взял код из стартового поста, и на той же схеме, получил такие разультаты
minitestbad.png
Ну где тут "в два раза"

На первом скрине "собственное время" составляет ~1.8мс
А на втором -- ~8.5мс

"Собственное время" -- это время на вычисление дополнительного (относительно мухобойного) кода:
+ 1/(%1+%2) + 1/(1+%1+%2) + 1/(2+%1+%2) + 1/(3+%1+%2) + 1/(4+%1+%2) + 1/(5+%1+%2) + 1/(6+%1+%2) + 1/(7+%1+%2) + 1/(8+%1+%2) + 1/(9+%1+%2)
карма: 9

0
файлы: 2minitestgood.png [7.3KB] [651], minitestbad.png [7.3KB] [676]
Разработчик
Ответов: 4698
Рейтинг: 426
#49: 2014-06-25 18:42:29 ЛС | профиль | цитата
Galkov писал(а):
Странно Вы измеряете, однако
Вот я сказал - в пять раз.
Взял этот код
Эту схему.
Получил такие результаты

Мое упущение: в пять раз - это без оптимизаций методов Read/WriteXXX (т.е. без убирания использования Move) и оптимизации работы со стеком. В два раза - это с упомянутыми оптимизациями. Т.е. классовая структура все-таки накладывает лишние операции и проверки, которые уже могут быть учтены в самом MathParse. (Причем, вопроса о самих накладках вообще не стояло, вопрос стоял только в соотношении: насколько велик оверхед).

Описываемая прадигма разработки, конечно, хороша. Как мне думается, главное - знать когда остановиться. Т.е. не стать космонавтом архитектуры, а вовремя вспомнить и начать писать код. (Оптимизировать, кстати, можно и до уровня ассемблера Но это уже не наша задача ). Но чтобы в совершенстве овладеть этой прадигмой, надо все же накопить побольше опыта, чем у меня. А опыта не прибавится, если я буду просто брать уже готовые решения.
карма: 10
0
Ответов: 9906
Рейтинг: 351
#50: 2014-06-26 08:02:39 ЛС | профиль | цитата
Блин, опять забыл: в вышеупомянутой схеме DebugMode установлен в False, и потом уж сделаны измерения
Влияет, собака

------------ Дoбавленo в 08.02:
nesco, а скажи мню, пожалуйста:
   1) Мультистрочность, и CalcErrPos - это ты вводил ???
   2) А чего там какие-то артефакты от not - есть, а его самого - как бы и нет ???
карма: 9

0
Разработчик
Ответов: 4698
Рейтинг: 426
#51: 2014-06-26 10:31:09 ЛС | профиль | цитата
Galkov писал(а):
А чего там какие-то артефакты от not - есть, а его самого - как бы и нет ???

Гы, реально, а я думал, что это я забыл реализовать not
карма: 10
0
Разработчик
Ответов: 26113
Рейтинг: 2126
#52: 2014-06-26 11:28:11 ЛС | профиль | цитата
Galkov писал(а):
А чего там какие-то артефакты от not - есть, а его самого - как бы и нет ???

Не понял
карма: 22

0
Ответов: 9906
Рейтинг: 351
#53: 2014-06-26 12:38:14 ЛС | профиль | цитата
Хм...

Значит так:
   1) есть у нас такой элемент - MathParse.
   2) есть в природе такой логический унарный оператор - not
   3) вопрос: должен ли про not знать MathParse

Почему спрашиваю.
Потому что, лично я, логические операторы and, or, и xor в коды MathParse не вносил. Вроде бы
Но они реализованы.
Магическое слово not - тоже в кодах встречается, Но он не реализован.

Вот.... Это про второе.
А про первое - не услышал ничего.
карма: 9

0
Разработчик
Ответов: 26113
Рейтинг: 2126
#54: 2014-06-26 13:32:29 ЛС | профиль | цитата
Galkov писал(а):
А про первое - не услышал ничего.

Про мультистрочность -- да, это я делал.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#55: 2014-06-26 14:06:05 ЛС | профиль | цитата
Вот....

Так НИЗЯ тупо удалять переводы строк.
ИБО: два Имени могут склеиться в одно (первое в конце строки, а второе - в начале следующей)

Правильно было бы вообще не суетиться со всякими там Replace... Глупая это операция - Replace...
1) SafeLine можно было бы запомнить ДО приклеивания концевого маркера
2) В GetToken уже есть пропуск "пробельных символов". Ну стало бы их на два больше:
#pas
while Line[LPos] in [,#9,#10,#13] do inc(LPos);

НО, CalcErrPos тогда как-то по другому считать должен.
Не поправишь
А Assasin, у тебя срисует
------------ Дoбавленo в 14.06:
А то у меня минус какой-то....
карма: 9

0
Разработчик
Ответов: 4698
Рейтинг: 426
#56: 2014-06-26 14:18:42 ЛС | профиль | цитата
Про not: svn все знает


карма: 10
0
Разработчик
Ответов: 26113
Рейтинг: 2126
#57: 2014-06-26 14:22:49 ЛС | профиль | цитата
Galkov писал(а):
Так НИЗЯ тупо удалять переводы строк

Что добавил, то и убрал.
Galkov писал(а):
Ну стало бы их на два больше

И как предполагается тогда отследить строки, когда строковые пробелы невозможно отличить от обычных.
Galkov писал(а):
НО, CalcErrPos тогда как-то по другому считать должен

Я, к примеру, не вижу другого решения. Есть ли конкретные предложения по другому алгоритму
Galkov писал(а):
Правильно было бы вообще не суетиться со всякими там Replace... Глупая это операция - Replace...

Может она и глупая, но не влияет на быстродействие счета никак.
Galkov писал(а):
SafeLine можно было бы запомнить ДО приклеивания концевого маркера

Вот с этим -- да, не поспоришь, тут я точно ступил.
Galkov писал(а):
ИБО: два Имени могут склеиться в одно (первое в конце строки, а второе - в начале следующей)

А с чего бы это должно получиться, конкретный пример можно
карма: 22

0
Разработчик
Ответов: 4698
Рейтинг: 426
#58: 2014-06-26 14:27:09 ЛС | профиль | цитата
nesco писал(а):
А с чего бы это должно получиться, конкретный пример можно

Можно:
code_33897.txt
А по поводу подсчета строк, добавить переменную LNum, CLPos и заменить пропуск пробелов в GetToken:
#pas
while Line[LPos] in [,#9,#10,#13] do begin
inc(LPos);
if not (Line[LPos] in [#10,#13]) then inc(CLPos);
if Line[LPos] = #10 then begin
inc(LNum);
CLPos := 0;
end;
end;
UPD: добавил учет позиции в текущей строке, а не во всем выражении.
карма: 10
0
файлы: 1code_33897.txt [661B] [510]
Разработчик
Ответов: 26113
Рейтинг: 2126
#59: 2014-06-26 14:39:24 ЛС | профиль | цитата
Assasin писал(а):
Про not: svn все знает

Это не я делал, я просто добавил изменения от Galkov-a, после того, как он ввел выносные функции

------------ Дoбавленo в 14.39:
Assasin писал(а):
А по поводу подсчета строк, добавить переменную LNum, CLPos и заменить пропуск пробелов в GetToken

Я не стал глубоко лезьть в коды, а просто сделал привязку к тому, что было, и тогда, когда я это делал, выносных функций еще не было. Если вы сейчас переработает компонент, тк глубоко в нем зарылись, то никто возражать не будет, а мне сейчас рыть ваши коды -- это просто толстый полярный лисиц какой-то
карма: 22

0
Разработчик
Ответов: 4698
Рейтинг: 426
#60: 2014-06-26 14:39:49 ЛС | профиль | цитата
nesco писал(а):
Это не я делал, я просто добавил изменения от Galkov-a, после того, как он ввел выносные функции

Так я и не говорю, что ты, наоборот на скриншотах отчетливо видно, что добавлял это Dilma
карма: 10
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)