Форум программистов, компьютерный форум, киберфорум
Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/134: Рейтинг темы: голосов - 134, средняя оценка - 4.62
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4

Общие вопросы и приёмы эффективного программирования на BASIC

27.03.2021, 15:34. Показов 32470. Ответов 391
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот как создать кнопку:
PureBasic
1
2
3
4
5
6
7
8
9
10
Dim hwndButton As HWND = CreateWindow( _
    WC_BUTTON,
    "Текст кнопки", _
    WS_CHILD Or BS_BITMAP Or BS_PUSHBUTTON Or WS_CLIPSIBLINGS, _
    10, 10, 100, 50, _
    hwndMainForm, _
    Cast(HMENU, 1000), _
    hInst, _
    NULL _
)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.03.2021, 15:34
Ответы с готовыми решениями:

Общие вопросы по языку 1с Visual Basic
Всем привет, много информации нашел, но путевого очень мало, подскажите, пожалуйста, где можно побольше прочитать о достоинстве этого...

Приемы взаимодействия Visual Basic и SQL
При создании приложений, оперирующих базами данных, нередко возникают проблемы, связанные с организацией взаимодействия языка...

Основные понятия и приемы программирования
Помогите ответить на вопросы по С#. 1)Создание объектов.Понятия ссылки. 2)Массивы:одномерные,многомерные,непрерывные,массивы объектов. ...

391
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
09.04.2021, 22:34
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от The trick Посмотреть сообщение
Реальную пользу уже выше написали
Ты мог за то время, пока реверсил VB и делал ему хирургические вмешательства, просто нахрен его переписать
с нуля. Не понятно только, почему не сделал и почему не пишешь на си, если знаешь его.
Это какое-то садо мазо, но надо обязательно зайти и попинать народ на других диалектах.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
09.04.2021, 22:49
Цитата Сообщение от The trick Посмотреть сообщение
Ну изменится, а ты утверждал что нет.
Ты внимательно читай:
Цитата Сообщение от Pro_grammer Посмотреть сообщение
указатель на строку не меняется, если изначально достаточно выделено памяти.
А если не достаточно, то да, МОЖЕТ измениться. И это нормально - просто выделяется другой подходящий кусок.
Но на содержание переменной это не повлияет,
Цитата Сообщение от The trick Посмотреть сообщение
все гораздо печальнее будет.
И печали не будет!


Цитата Сообщение от Quiet Snow Посмотреть сообщение
почему не пишешь на си
Дык потому и не пишуть, что то что на Basic можно за день написать без указателей, то на Си с указателями неделю надо, а потом ещё неделю на отладку, баги вылавливать
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
09.04.2021, 22:51
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Ты мог за то время, пока реверсил VB и делал ему хирургические вмешательства, просто нахрен его переписать
с нуля.
Да зачем мне это надо? Я помимо VB6 знаю еще языки. Да, если мне что-то не хватает, я делаю "костыли" типа таких, но чаще я просто выбираю другой инструмент. Другой момент - это то что его уже переписывают потихоньку. А на днях уже вышли первые версии "заменителей" вб, но я их не смотрел еще. Это RadBasic и TwinBasic.

Цитата Сообщение от Quiet Snow Посмотреть сообщение
Не понятно только, почему не сделал и почему не пишешь на си, если знаешь его.
Пишу и на C и на плюсах.

Цитата Сообщение от Quiet Snow Посмотреть сообщение
Это какое-то садо мазо, но надо обязательно зайти и попинать народ на других диалектах.
Да нет, просто Замабувараев правильную мысль высказал, а вы пытаетесь это опровергнуть. Ну и я вообще в эту тему зашел из-за критики COM от хулигана.
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
09.04.2021, 23:12
Цитата Сообщение от Pro_grammer Посмотреть сообщение
А если не достаточно, то да, МОЖЕТ измениться. И это нормально - просто выделяется другой подходящий кусок.
Это НЕ ВЛИЯЕТ НИКОИМ ОБРАЗОМ! Ты код видел? У тебя при каждом присвоении строки происходит перевыделение памяти, и не важно сколько ты там изначально выделял. Это вообще ненужная операция. Я прекрасно понимаю ход твоих мыслей, но поверь мне, он неверный:

, и не важно сколько ты там изначально навыделял.

Цитата Сообщение от Pro_grammer Посмотреть сообщение
Но на содержание переменной это не повлияет,
Понимаешь, об этом тут речи не было. Тут было сравнение механизмов выделения памяти в стеке и в хипе. Ты влез в этот спор чтобы продемонстрировать что? Замабувараев сказал что в стеке также можно перевыделить память, только она будет уже расположена в другом месте, и нужно туда будет скопировать строку. Также он показал что динамические строки о которых вы тут начали вести спор также могут быть перемещены в памяти. Еще раз, что ты хотел продемонстрировать?
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
10.04.2021, 00:01
Цитата Сообщение от The trick Посмотреть сообщение
Да нет, просто Замабувараев правильную мысль высказал, а вы пытаетесь это опровергнуть.
Не пытаюсь опровергнуть то, что аллокатить дольше, чем сделать sub esp, XXX.
Пытаюсь лишь сказать, что:
1) Проблема преувеличена. Т.к. удельное кол-во строковых операций на все иные - не так велико.
Дай бог процентов 20, а то и меньше. Софта, ориентированного на строки, тоже по пальцам пересчитать.
2) Скорости большинства классических(не .NET) диалектов достаточно для любых задач со строками.
С этим вообще нет никаких проблем.
3) Озвученные сценарии разработки неправдоподобны, программисты не бараны, об стенку рогами
долбиться не будут, делая внутри двойного цикла(или аналогичных ситуациях) аллокат, а это единственная
ситуация когда разность методик даст уверенную разницу. Грамотные люди его всегда делают заранее,
в те моменты, когда оно не критично, это может выражаться во всём, но так или иначе в лобешник не делают. Претензии высказывались к хепу в целом, а не со стороны строк. Я же говорю, что там всё нормально,
если делать по-человечески и все эти претензии - не имеют под собой основания в виде "ваш софт гарантированно будет работать на 5% медленнее". Дай бог там 1% нарисуется на компе 20-ти летней давности.
И со строками тоже момент тонкий, с их объёмом и размером.
4) Что есть нюансы, касаемо как раз оптимизации. Что push\pop важны(например чтобы сохранять счётчик
внешнего цикла), а работать со строкой(или что там ещё можно так завести) может потребоваться
в любом месте и хинты со стеком создадут жопу с этой точки зрения для других частей программы,
указатель придётся возвращать(потому что стек это структура вида "последний пришёл - первый ушёл"
и сместив указатель мы нарушаем её), а чтобы возвращать, нужно понимать на сколько, это значение
из памяти. То что могло улезть в регистры за один присест и находиться в них, ускоряя процесс обсчёта,
будет мотаться по тому же стеку или локалкам туда сюда, этого не всегда можно избежать, а точнее
мало когда, но 1 лишний регистр как правило существенно ускоряет алгоритм, если будут такие места,
где можно внутренний цикл полностью загнать в регистры, ну понятное дело указатели по памяти шерстят,
но это единственные накладные расходы. И это как раз то, что может свести на нет всю пользу от этого дела
и машинная оптимизация тут лишь вводит в заблуждение.
Т.е. чтобы получить реально увесистые значения пользы, нужно минимум иметь двойной цикл и аллокатить
стек в нём. Любому программисту вроде бы должно быть понятно, что истратить весь стек таким образом
можно за стотысячную долю секунды и даже быстрее, но даже если это какой-то умный алг, который,
отрабатывая, возвращает, - это всё равно опасно, там надо смотреть динамику расхода, анализировать
глубину рекурсии, возможность нехватки памяти. Это само по себе геморрой, просто как действие.
Да, за обычной памятью тоже надо следить и всё такое, но в тривиальных задачах должно быть понятно
что её в разы больше и проблем не будет с вероятностью большей на порядки.

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

Добавлено через 8 минут
И это при всём при том, если сам алгоритм нельзя
подобрать более грамотный(разбить по потокам, применить хитрые структуры и методики) и мол надо крутить
эти сраные циклы.
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
10.04.2021, 00:19
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Проблема преувеличена. Т.к. удельное кол-во строковых операций на все иные - не так велико.
Дай бог процентов 20, а то и меньше. Софта, ориентированного на строки, тоже по пальцам пересчитать.
Почему ты ограничиваешься только строками? Никто тут не утверждал что все должны тут же использовать стек. Тут было сказано что это эффективнее в некоторых сценариях и может использоваться как средство оптимизации. Это вы раздуваете проблему и резко выступаете против памяти в стеке.

Цитата Сообщение от Quiet Snow Посмотреть сообщение
Скорости большинства классических(не .NET) диалектов достаточно для любых задач со строками.
С этим вообще нет никаких проблем.
Опять ты ограничиваешься строками. Скорости достаточно, но если возможно то можно сделать быстрее. Но никто вас не заставляет - пишите как хотите. Вам предложили вариант - ваше дело использовать его или нет.

Цитата Сообщение от Quiet Snow Посмотреть сообщение
Озвученные сценарии разработки неправдоподобны, программисты не бараны, об стенку рогами
долбиться не будут, делая внутри двойного цикла(или аналогичных ситуациях) аллокат, а это единственная
ситуация когда разность методик даст уверенную разницу. Грамотные люди его всегда делают заранее,
в те моменты, когда оно не критично, это может выражаться во всём, но так или иначе в лобешник не делают. Претензии высказывались к хепу в целом, а не со стороны строк.
Ты еще не учитываешь такие факторы как например фрагментация кучи. Мелкими строками можно фрагментировать кучу так что потом большие объемы могут стать недоступны. Насчет баранов, я бы поспорил. Много кто в таких циклах делает конкатенацию строк, а это постоянное перевыделение памяти из хучи (код одного присвоения я уже скинул, можешь оценить)

Цитата Сообщение от Quiet Snow Посмотреть сообщение
Что есть нюансы, касаемо как раз оптимизации. Что push\pop важны(например чтобы сохранять счётчик
внешнего цикла), а работать со строкой(или что там ещё можно так завести) может потребоваться
в любом месте и хинты со стеком создадут жопу с этой точки зрения для других частей программы,
указатель придётся возвращать(потому что стек это структура вида "последний пришёл - первый ушёл"
и сместив указатель мы нарушаем её), а чтобы возвращать, нужно понимать на сколько, это значение
из памяти. То что могло улезть в регистры за один присест и находиться в них, ускоряя процесс обсчёта,
будет мотаться по тому же стеку или локалкам туда сюда, этого не всегда можно избежать, а точнее
мало когда, но 1 лишний регистр как правило существенно ускоряет алгоритм, если будут такие места,
где можно внутренний цикл полностью загнать в регистры, ну понятное дело указатели по памяти шерстят,
но это единственные накладные расходы. И это как раз то, что может свести на нет всю пользу от этого дела
и машинная оптимизация тут лишь вводит в заблуждение.
В таких алгоритмах просто не нужно использовать push/pop пары. Либо использовать их в местах где они не будут конфликтовать с выделенной памятью в стеке. Еще раз напишу что это надуманная проблема.

Цитата Сообщение от Quiet Snow Посмотреть сообщение
На деле конечно нужно смотреть и то и то, все варианты, что быстрее, всё тестировать.
Мысль интересная, получать халявные такты из воздуха, никто не спорит как-бы. Но так ли это безвредно
во всём остальном, кроме тестов на хеллоу ворлдах.
Плюс всё это можно без стека делать, завести кусок памяти толстый и вуаля. Вот тебе аналог, юзай,
а стек остаётся для соотв. алгоритмических нужд.
Я тебе больше скажу, используется очень часто такая оптимизация. Толстым куском в общем случае не заменить.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
10.04.2021, 00:31  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
По факту код получился такой:
А как получили этот Си‐код? PureBasic транслируется в Си?
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
10.04.2021, 00:33
Цитата Сообщение от Замабувараев Посмотреть сообщение
А как получили этот Си‐код? PureBasic транслируется в Си?
IDA Pro – Hex Rays
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
10.04.2021, 02:22  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
IDA Pro – Hex Rays
А, из дизассемлерного.
А то Я подумал, что PureBasic перешёл на кодогенератор Си типа ГЦЦ или Шланг.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
10.04.2021, 09:50
Цитата Сообщение от The trick Посмотреть сообщение
Почему ты ограничиваешься только строками?
Ими как раз не ограничиваюсь, эти отдельные две реплики были про то, как вы ими внезапно тут ограничились.
Например так:

Цитата Сообщение от The trick Посмотреть сообщение
Насчет баранов, я бы поспорил. Много кто в таких циклах делает конкатенацию строк


Цитата Сообщение от The trick Посмотреть сообщение
Толстым куском в общем случае не заменить.
Всмысле не заменить? Что за бред. Тот самый epb можно отвести на это грязное дело.
Просто считай, что ebp, это esp и всё. Тебе push\pop, как видно, всё равно не нужны.
Даже мозгам удобнее, поинтер не вычитать, а прибавлять, никто эту память не трогает,
измерить потребление проще, меньше вероятность опростоволоситься.

Добавлено через 7 минут
Цитата Сообщение от The trick Посмотреть сообщение
В таких алгоритмах просто не нужно использовать push/pop пары. Либо использовать их в местах где они не будут конфликтовать с выделенной памятью в стеке.
Вот это и есть подход - одно место лечим, другое калечим.
Уже писал, что это быстрее, чем память и есть такой параметр время доступа к памяти.
Стек рулил в том плане ещё давно. Инфа из 90-х. И посмотри ещё машинный байт код, для достоверности
что такое отпушать и что такое в память положить.
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
10.04.2021, 09:58
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Ими как раз не ограничиваюсь, эти отдельные две реплики были про то, как вы ими внезапно тут ограничились.
Вот твое сообщение:
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Проблема преувеличена. Т.к. удельное кол-во строковых операций на все иные - не так велико.
Дай бог процентов 20, а то и меньше. Софта, ориентированного на строки, тоже по пальцам пересчитать.
Это ответ на мое сообщение на то что он высказал правильную мысль насчет выделения памяти в стеке (памяти, а не строк).

Цитата Сообщение от Quiet Snow Посмотреть сообщение
Насчет баранов, я бы поспорил. Много кто в таких циклах делает конкатенацию строк
Ну это уже ответ на твое сообщение т.к. ты упомянул строки, про строки тебе и привел пример.

Цитата Сообщение от Quiet Snow Посмотреть сообщение
Всмысле не заменить? Что за бред. Тот самый epb можно отвести на это грязное дело.
Просто считай, что ebp, это esp и всё. Тебе push\pop, как видно, всё равно не нужны.
Даже мозгам удобнее, поинтер не вычитать, а прибавлять, никто эту память не трогает,
измерить потребление проще, меньше вероятность опростоволоситься.
Я написал в общем случае не заменить. Отведешь ты регистр на память и что? Вызовешь рекурсивно или из другого потока - что будет? Я уже писал об этом в ответах выше. Зачем повторять это снова и снова?

Цитата Сообщение от Quiet Snow Посмотреть сообщение
Вот это и есть подход - одно место лечим, другое калечим.
Ничего не калечим. Еще раз повторю - ты сам себе проблему придумал.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
10.04.2021, 12:44
Цитата Сообщение от The trick Посмотреть сообщение
ты упомянул строки, про строки тебе и привел пример.
Офигенно, это я ещё упомянул строки. Веселуха. Да мне вообще если честно в буквальном смысле
посрать на эти строки было, до всей этой дискуссии. Это вы тут все повёрнуты на строках в стеке.
Никак не можете понять, что это на бейсиках никому не надо. Все эти извращения.
У меня всё работало великолепно, всегда. Кодил, горя не знал. А тут то кодер хулиган лезет ко мне
со своими "сями" и видением мира за строки, то вы теперь всполошились. Да был бы толк ото всего этого.
Но вы как обычно ничего толкового и простого не предложите для разных BASIC диалектов.
Т.е. это так чисто похаять, сотрясти воздух лишний раз.
Или предложите говно какое-нибудь, типа не динамических строк, с последующим геморроем.

Цитата Сообщение от The trick Посмотреть сообщение
Еще раз повторю - ты сам себе проблему придумал.
А ты придумал фрагментацию кучи. Тоже проблема на ровном месте, сейчас ты, кончено,
склепаешь какой-нибудь хелло ворлдовский пример, который мне это продемонстрирует
и мол пофигу, что в нормальных проектах всё сделано по уму и ничего такого даже и
близко не будет, потому что их тестируют жесточайше перед релизом.

Добавлено через 8 минут
Цитата Сообщение от The trick Посмотреть сообщение
Вызовешь рекурсивно или из другого потока - что будет?
Вызове чего? Аллокации? Не особо понятно с чем будут проблемы.
что тут, что там мы меняем указатель и ОБЯЗАНЫ вернуть его на место.
А за потоки базара не было - не надо. Если брать потоки, то тут вообще все эти недостатки
нивелируются, отдельный поток может спокойно резервировать память.

Добавлено через 23 минуты
Вот тебе заведение блока в потоке и его лёгкое юзание в основной программе.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
'
'  Make Console Executable!!! 
'
DECLARE SUB MyProc (BYVAL userdata AS ANY PTR)
DIM SHARED OurPointer AS BYTE POINTER
 
 
  THREADCREATE ( @MyProc , 0)
  SLEEP 100, 1    ' Time on thread create and allocate memory
  '   Take value from memory created in thread
  PRINT PEEK (INTEGER, OurPointer)
 
 SLEEP
 
 
 SUB MyProc (BYVAL userdata AS ANY PTR)
    OurPointer = ALLOCATE ( 10 * 1024 * 1024 )  ' 10 MegaBytes Allocate in Thread 
    POKE INTEGER, OurPointer, 333
    SLEEP
 END SUB
И его листинг:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
    .intel_syntax noprefix
 
.section .text
.balign 16
 
.globl _MYPROC@4
_MYPROC@4:
push ebp
mov ebp, esp
.Lt_0004:
push 10485760
call _malloc
add esp, 4
mov dword ptr [_OURPOINTER], eax
mov eax, dword ptr [_OURPOINTER]
mov dword ptr [eax], 333
push -1
call _fb_Sleep@4
.Lt_0005:
mov esp, ebp
pop ebp
ret 4
.balign 16
_fb_ctor__TestMem:
.Lt_0002:
push 0
push 0
push offset _MYPROC@4
call _fb_ThreadCreate@12
push 1
push 100
call _fb_SleepEx@8
push 1
mov eax, dword ptr [_OURPOINTER]
push dword ptr [eax]
push 0
call _fb_PrintInt@12
push -1
call _fb_Sleep@4
.Lt_0003:
ret
 
.section .fbctinf
.ascii "-mt\0"
 
 
.section .bss
.balign 4
    .lcomm  _OURPOINTER,4
 
.section .ctors
.int _fb_ctor__TestMem
Добавлено через 4 минуты
В поток ещё можно переменную передать, любую. Гибко, приятно, никаких проблем вообще.
Какие в жопу проблемы? Проблемы у тех, кто кодить не умеет. Вот у них реально будут проблемы.
Почти все, кто тут в дискуссии участвует - у них проблем не будет с гарантией, какой бы
подход они не использовали.
1
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
10.04.2021, 13:09
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Офигенно, это я ещё упомянул строки.
Да. Ты мне на выделение памяти в стеке ответил:
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Т.к. удельное кол-во строковых операций на все иные - не так велико.
и т.д.

Цитата Сообщение от Quiet Snow Посмотреть сообщение
Это вы тут все повёрнуты на строках в стеке.
Да не повернуты мы ни на чем, успокойся. Вам высказали факт, а у вас от этого так бомбануло, что вы уже 10 страницу успокоится не можете, все пытаетесь уличить нас в чем-то .

Цитата Сообщение от Quiet Snow Посмотреть сообщение
У меня всё работало великолепно, всегда. Кодил, горя не знал.
Ну и дальше кодь, тебе кто-то мешает? Тебе что кто-то навязывает что-то или что? Сам продолжаешь дискутировать и выворачиваешь это так, будто бы тебя кто-то принуждает что-то делать; споришь о чем-то своем. Остановись!

Цитата Сообщение от Quiet Snow Посмотреть сообщение
Но вы как обычно ничего толкового и простого не предложите для разных BASIC диалектов.
Т.е. это так чисто похаять, сотрясти воздух лишний раз.
Или предложите говно какое-нибудь, типа не динамических строк, с последующим геморроем.
А что мы должны предложить? Мы что разработчики языка или компилятора? Я сказал что память стека более эффективна в некоторых случаях - все, и ты уже очередную страницу не можешь успокоится. Я ничего не хаял и не критиковал в отличии от вас.

Цитата Сообщение от Quiet Snow Посмотреть сообщение
А ты придумал фрагментацию кучи. Тоже проблема на ровном месте, сейчас ты, кончено,
склепаешь какой-нибудь хелло ворлдовский пример, который мне это продемонстрирует
и мол пофигу, что в нормальных проектах всё сделано по уму и ничего такого даже и
близко не будет, потому что их тестируют жесточайше перед релизом.
Я ничего не придумывал, в винде даже было такое понятие как Low-fragmentation heap. Ну ты и дальше можешь отрицать это. Капец конечно у вас тут самомнение раздуто.

Цитата Сообщение от Quiet Snow Посмотреть сообщение
Вызове чего? Аллокации? Не особо понятно с чем будут проблемы.
что тут, что там мы меняем указатель и ОБЯЗАНЫ вернуть его на место.
А за потоки базара не было - не надо. Если брать потоки, то тут вообще все эти недостатки
нивелируются, отдельный поток может спокойно резервировать память.
Чего-чего, вызове процедуры которая работает с этой памятью. Ты предложил выделять память заранее большим блоком и его использовать вместо стека. Как работать с такой памятью при рекурсивном вызове функции? С потоками ты вообще опять какую-то чепуху говоришь. При чем тут резервирование памяти потоком? Ты написал:
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Плюс всё это можно без стека делать, завести кусок памяти толстый и вуаля. Вот тебе аналог, юзай, а стек остаётся для соотв. алгоритмических нужд.
Заводим память в начале программы, и используем ее уже по ходу работы вместо стека. Отсюда вытекают проблемы - рекурсия, потоки.

Цитата Сообщение от Quiet Snow Посмотреть сообщение
И посмотри ещё машинный байт код, для достоверности
что такое отпушать и что такое в память положить.
Вот я специально сделал тест где можно проверить скорость доступа через push/pop с через Mov [ebp]:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
format PE console
 
entry TestPerf
 
include "win32ax.inc"
 
section '.idata' import data readable writeable
 
library kernel32,'KERNEL32.DLL', \
        msvcrt, 'MSVCRT.DLL'
 
import kernel32, \
       QueryPerformanceCounter, 'QueryPerformanceCounter',\
       QueryPerformanceFrequency, 'QueryPerformanceFrequency', \
       ExitProcess, 'ExitProcess'
 
import msvcrt, \
       printf, 'printf'
 
section '.text' code readable executable
 
proc TestPerf
   locals
       qFreq dq ?
       qStart dq ?
       qEnd dq ?
       q1000 dq 1000.0
   endl
   local dSpace[7]:DWORD
 
   invoke QueryPerformanceFrequency, addr qFreq
   invoke QueryPerformanceCounter, addr qStart
 
   xor ecx, ecx
 
   @@:
 
if PUSHPOP_TEST
 
   push eax
   push ecx
   push edx
   push ebx
   push esi
   push edi
 
   mov eax, 1234
   mov ecx, 9321
   mov edx, 34231
   mov ebx, 21212
   mov esi, 3412
   mov edi, 43223
 
   pop edi
   pop esi
   pop ebx
   pop edx
   pop ecx
   pop eax
 
else
 
   mov [dSpace], eax
   mov [dSpace + 0x04], ecx
   mov [dSpace + 0x08], edx
   mov [dSpace + 0x0c], ebx
   mov [dSpace + 0x10], esi
   mov [dSpace + 0x14], edi
 
   mov eax, 1234
   mov ecx, 9321
   mov edx, 34231
   mov ebx, 21212
   mov esi, 3412
   mov edi, 43223
 
   mov eax, [dSpace]
   mov ecx, [dSpace + 0x04]
   mov edx, [dSpace + 0x08]
   mov ebx, [dSpace + 0x0c]
   mov esi, [dSpace + 0x10]
   mov edi, [dSpace + 0x14]
 
end if
 
   loop @b
 
   invoke QueryPerformanceCounter, addr qEnd
 
   mov eax, dword [qEnd]
   mov edx, dword [qEnd + 4]
   sub eax, dword [qStart]
   sbb edx, dword [qStart + 4]
   mov dword [qEnd], eax
   mov dword [qEnd + 4], edx
   fild [qFreq]
   fild [qEnd]
   fmul [q1000]
   fdivrp
   fstp [qEnd]
 
   invoke printf, '%lf ms', dword [qEnd], dword [qEnd + 4]
   invoke ExitProcess, 0
 
endp
Вот мои результаты:


Как видишь push/pop медленней.
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
10.04.2021, 13:13
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Вот тебе заведение блока в потоке и его лёгкое юзание в основной программе.
Не смеши меня . Ты вообще тему читаешь? Давай так, что ты этим тестом хотел показать?

Цитата Сообщение от Quiet Snow Посмотреть сообщение
Какие в жопу проблемы? Проблемы у тех, кто кодить не умеет. Вот у них реально будут проблемы.
Почти все, кто тут в дискуссии участвует - у них проблем не будет с гарантией, какой бы
подход они не использовали.
Да ты судя по всему вообще не понимаешь о чем тут идет речь. Какие уж тут проблемы
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
10.04.2021, 13:36
В обратку тоже работает:
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
'
'  Make Console Executable!!! 
'
DECLARE SUB MyProc (BYVAL userdata AS ANY PTR)
DIM SHARED OurPointer AS BYTE POINTER
 
  THREADCREATE ( @MyProc , 0)
  SLEEP 100, 1    ' Time on thread guaranteed to be created, after this action we make allocate.
  OurPointer = ALLOCATE ( 10 * 1024 * 1024 )  ' 10 MegaBytes Allocate in main programm thread
  POKE INTEGER, OurPointer, 555
  SLEEP 100, 1    ' Wait
 
 SLEEP
 
 
 SUB MyProc (BYVAL userdata AS ANY PTR)
    SLEEP 200, 1
    '   Take value from memory created in main thread of programm
    PRINT PEEK (INTEGER, OurPointer)
    SLEEP
 END SUB
Там если заморочиться, думаю можно свои макросы выделить на выделение памяти(просто двинуть регистр),
чтобы удобнее было организовать код в процедуре потока.

Цитата Сообщение от The trick Посмотреть сообщение
Я написал в общем случае не заменить.
В общем случае и хеп память не заменить стеком. Это всё "частные" ухищрения.
Бейсик людям вообще чисто для ВУ логики, когда начинаются эти пляски с оптимизацией
уже на самом диалекте - там такие "кони люди" получаются, что хоть стой хоть падай.
Нужна оптимизация - есть ASM. А иначе мы получаем замороченный исходник, в котором
высока вероятность словить баг и нежелание потом к нему возвращаться для допиливания,
потому что там сам чёрт ногу сломает. Одно дело когда мы пишем библиотеку или
API прослойку для проекта и совсем другое уже чистый код проекта.

Цитата Сообщение от The trick Посмотреть сообщение
Давай так, что ты этим тестом хотел показать?
А что ты хотел сказать?
Я показал отсутствие каких-либо проблем с доступом к памяти из потока и наоборот.
Надо завёл там, надо завёл сям. Что ты имел в виду вот этим? :

Цитата Сообщение от The trick Посмотреть сообщение
Отведешь ты регистр на память и что? Вызовешь рекурсивно или из другого потока - что будет?
Я честно хз, о чём ты вообще. О потоках каких-то попёр. Это мне смешно уже.

Цитата Сообщение от The trick Посмотреть сообщение
Как видишь push/pop медленней.
Оставь одну инструкцию и луп этот говёный убери, цикл организуй нормально(CMP, JNZ).
Позже буду смотреть. На старом компе адекватнее. Это какая-то чушь, стек плохо спаривается
в отличие от остального, тебе это прекрасно известно, не надо таких подтасовок.
На 2,3,4 пеньке запусти, там без квери перфоманса можно и по таймеру замер сделать, цикл побольше воткнуть и всё.

Добавлено через 5 минут
Цитата Сообщение от The trick Посмотреть сообщение
Да ты судя по всему вообще не понимаешь о чем тут идет речь. Какие уж тут проблемы
Ты зато понимальщик тот ещё. Вот через пол годика себя в нормальную рабочую форму приведу, компы настрою,
посмотрим у кого понимание чище, специально зайду в эту тему, но уже с нормальными примерами,
а не детским садом из хелло ворлдов и попыток натянуть это на общий случай.
1
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
10.04.2021, 14:00  [ТС]
Цитата Сообщение от Quiet Snow Посмотреть сообщение
ALLOCATE ( 10 * 1024 * 1024 )  ' 10 MegaBytes Allocate in Thread
Цитата Сообщение от Quiet Snow Посмотреть сообщение
ALLOCATE ( 10 * 1024 * 1024 )  ' 10 MegaBytes Allocate in main programm thread
У вас фундаментальная ошибка.
Функция Allocate выделяет память из кучи, а не из «памяти потока».
Переделывайте.

Добавлено через 6 минут
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Бейсик людям вообще чисто для ВУ логики, когда начинаются эти пляски с оптимизацией
уже на самом диалекте - там такие "кони люди" получаются, что хоть стой хоть падай.
Нужна оптимизация - есть ASM.
Не согласен. В языке должны быть достаточные средства для оптимизации, чтобы не лезть в ассемблер.
Цитата Сообщение от Quiet Snow Посмотреть сообщение
там без квери перфоманса можно и по таймеру замер сделать
Нельзя. Измерять производительность нужно только так.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
10.04.2021, 14:19
Цитата Сообщение от Замабувараев Посмотреть сообщение
а не из «памяти потока».
Где писал про какую-то "память потока"? Там листинг сверху и фигурирует сишная функция malloc.
Хеп она там заводит или ещё чего, мне до бзды, функция даёт мне указатель на валидную память,
которую видно из дочерних потоков, лишь завёл глобальный указатель чтобы её адресовать.
Это всё что мне надо знать. Этот код как и все приведённые в теме - бесполезен чуть более чем полностью.
Ещё тут ни одного исходника не увидел, который бы дал однозначный ответ на вопрос использования
озвучиваемой фичи, такого чтобы закрыть все просто вопросы и об оптимизации и об удобном использовании
и чтобы глаза не резал сам код.

Добавлено через 4 минуты
Цитата Сообщение от Замабувараев Посмотреть сообщение
Не согласен. В языке должны быть достаточные средства для оптимизации, чтобы не лезть в ассемблер.
Ну кодь на си, кто не даёт?

Цитата Сообщение от Замабувараев Посмотреть сообщение
Нельзя. Измерять производительность нужно только так.
С фига ли нельзя? Я бы сказал прямо наоборот надо смотреть именно на больших значениях, что в массе
мы имеем, а не на миллиписечных, где можно за один проход понять примерно расклад. И надо смотреть
на задачах встречаемых, например сохранять счётчики циклов. Если бы код был в таком ключе,
то слова бы не сказал. А это сферический конь в квадратном вакууме.

Добавлено через 9 минут
Цитата Сообщение от Замабувараев Посмотреть сообщение
Не согласен. В языке должны быть достаточные средства для оптимизации, чтобы не лезть в ассемблер.
Это BASIC у него другая идеология. Вы никак не поймёте это. Самая классика данного подхода
это QuickBasic. С которого FB за здравие начал и закончил за упокой. Причём это ожидает
и другие среды, куда протянут свои ручонки сишники со своей, другой идеологией.
Я вот к ним не лезу, не учу их жизни, хотя там балванов тоже хватает.
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
10.04.2021, 14:29
Цитата Сообщение от Quiet Snow Посмотреть сообщение
В обратку тоже работает:
Еще раз. Твои примеры ничего не показывают.

Цитата Сообщение от Quiet Snow Посмотреть сообщение
В общем случае и хеп память не заменить стеком. Это всё "частные" ухищрения.
Нет. Тебя опять что-то куда-то не туда несет. Тут было предложено использование стека вместо хипа в некоторых сценариях в качестве увеличения производительности кода. Ты же влез и предложил вместо памяти стека в таком случае использовать предварительно выделенную память. Я написал что такая память в общем случае не замена стеку из-за проблем рекурсии и многопоточности (это еще я хулигану писал когда он статическую память предлагал, но ты видимо как и программер не читаешь о чем тут пишут). Надеюсь понятно?

Цитата Сообщение от Quiet Snow Посмотреть сообщение
Бейсик людям вообще чисто для ВУ логики, когда начинаются эти пляски с оптимизацией
уже на самом диалекте - там такие "кони люди" получаются, что хоть стой хоть падай.
Ну так а зачем тогда в бейсиках инлайн асм? Ну не нужен он тогда тоже по твоей логике.

Цитата Сообщение от Quiet Snow Посмотреть сообщение
А иначе мы получаем замороченный исходник, в котором
высока вероятность словить баг и нежелание потом к нему возвращаться для допиливания,
потому что там сам чёрт ногу сломает.
Да ладно, в ваших бейсиках уже и прямая работа с памятью и указателями. О чем речь вообще? Мне уже кто-то из вас говорил (по моему locm) что если есть какая-то доп возможность - почему это должно быть плохо?

Цитата Сообщение от Quiet Snow Посмотреть сообщение
А что ты хотел сказать?
Я уже неоднократно описывал это. Мне уже надоело, как попугай тут повторять все по 100 раз, как малышам.

Цитата Сообщение от Quiet Snow Посмотреть сообщение
Я показал отсутствие каких-либо проблем с доступом к памяти из потока и наоборот.
А что кто-то писал что будут проблемы при таком доступе который ты продемонстрировал? Капец ну вы тут жжете!

Цитата Сообщение от Quiet Snow Посмотреть сообщение
Я честно хз, о чём ты вообще. О потоках каких-то попёр. Это мне смешно уже.
Ты "хз" потому что ты не в теме. Ты выложил свой код который абсолютно ничего не показывает и никоим боком не стоит к выделению памяти в стеке. Выдели память "толстым куском" и передавай ее потокам в которых рекурсивно вызывай функции работающие с этой памятью. Вот тебе и будет облом. Со стеком такой проблемы априори быть не может, т.к. стек для каждого потока свой, стек автоматом индексируется на уровне железа. Ты же выложил какой-то код что выделяет в потоке память в хипе, ну и что ты этим хотел показать? Чем этот подход отличается от тех что тут locm и Pro_grammer описывали?

Цитата Сообщение от Quiet Snow Посмотреть сообщение
Оставь одну инструкцию и луп этот говёный убери, цикл организуй нормально(CMP, JNZ).
Делай как тебе надо сам. Код нормальный и показывает то о чем ты писал, только в другую сторону.

Цитата Сообщение от Quiet Snow Посмотреть сообщение
Это какая-то чушь, стек плохо спаривается
в отличие от остального, тебе это прекрасно известно, не надо таких подтасовок.
Это ты городишь чушь. И там и там идет запись в стек, только в одном случае через push/pop, в другом через mov [ebp]. Реально о чем я и писал так и оказалось - что разницы никакой нет (а в реале, по крайней мере на моем ПК, мой способ даже быстрее). И все те проблемы что ты там описывал созданы только тобой.

Цитата Сообщение от Quiet Snow Посмотреть сообщение
Ты зато понимальщик тот ещё. Вот через пол годика себя в нормальную рабочую форму приведу, компы настрою,
посмотрим у кого понимание чище, специально зайду в эту тему, но уже с нормальными примерами,
а не детским садом из хелло ворлдов и попыток натянуть это на общий случай.
Через пол-годика ничего не поменяются. Как я неоднократно писал - от того что вы тут говорите вещи не перестанут быть другими. Не нужно сейчас мне так говорить. Просто успокойся, перечитай тему нормально, о чем я пишу. Потом посмотри что ты пишешь, на что отвечаешь и что отвечаешь и возможно все встанет на свои места у тебя в голове.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
10.04.2021, 14:37
Цитата Сообщение от The trick Посмотреть сообщение
это еще я хулигану писал когда он статическую память предлагал, но ты видимо как и программер не читаешь о чем тут пишут
Конечно не читаю что ты писал хулигану, мне это попросту не интересно. С Хулиганом уже все вопросы решил.

Цитата Сообщение от The trick Посмотреть сообщение
Через пол-годика ничего не поменяются.
Посмотрим.

Цитата Сообщение от The trick Посмотреть сообщение
Делай как тебе надо сам.
Анатолий, не переживай сделаю, сейчас запарок хватает и без этого. Я за свои слова всегда отвечаю.
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
10.04.2021, 14:45
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Хеп она там заводит или ещё чего, мне до бзды, функция даёт мне указатель на валидную память,
которую видно из дочерних потоков, лишь завёл глобальный указатель чтобы её адресовать.
Ну и что этот код показывает? Каким боком он вообще к выделению памяти в стеке? Что он показывает? С таким успехом ты бы мог приплести сюда вычисление факториала, но какой в этом смысл?

Цитата Сообщение от Quiet Snow Посмотреть сообщение
С фига ли нельзя? Я бы сказал прямо наоборот надо смотреть именно на больших значениях, что в массе
мы имеем, а не на миллиписечных, где можно за один проход понять примерно расклад. И надо смотреть
на задачах встречаемых, например сохранять счётчики циклов. Если бы код был в таком ключе,
то слова бы не сказал. А это сферический конь в квадратном вакууме.
Ну это вообще ересь. Тебе скинули код с высокочастотным и высокоточным счетчиком времени, алё! Ты вообще код даже не читал судя по всему иначе бы не нес такую чепуху. Там цикл на 4млрд итераций, дядя, куда еще больше?

Цитата Сообщение от Quiet Snow Посмотреть сообщение
Это BASIC у него другая идеология. Вы никак не поймёте это. Самая классика данного подхода
это QuickBasic. С которого FB за здравие начал и закончил за упокой. Причём это ожидает
и другие среды, куда протянут свои ручонки сишники со своей, другой идеологией.
Я вот к ним не лезу, не учу их жизни, хотя там балванов тоже хватает.
Ну и у пурика насколько я понимаю асм встроенный и память выделять можно, и указатели. Тебя никто не учит жизни, скорее наоборот.

Добавлено через 4 минуты
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Конечно не читаю что ты писал хулигану, мне это попросту не интересно. С Хулиганом уже все вопросы решил.
Да я и тебе тоже писал:
Цитата Сообщение от The trick Посмотреть сообщение
Ну и? Заведешь и что? Как это будет выглядеть? Кто будет следить за этой памятью? Вызываешь ты функцию что в этой памяти выделяет регион. Эта функция в свою очередь вызывает другую которая также выделяет память в этом региона. Как ты собираешься распределять эту память? Колхозить стек? Это ли не усложнение? У нас уже есть механизм для локальных переменных который реализован в железе и не не нужно что-то другое придумывать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.04.2021, 14:45
Помогаю со студенческими работами здесь

Стоит ли изучать как устроена ЭВМ для эффективного программирования
Всем дробового времени суток (пятница!!!) Стоит ли изучать как устроен ЭВМ для эффективного программирования на плюсах ?

Подскажите ссылки на приемы программирования для Embedded
Народ! Подскажите пожалуйста ссылки, на приемы и упражнения по программированию, с разьяснениями по встраеваемому ПО. Заранее благодарю!

Нужны сайты про C#, приемы, рецепты, трюки программирования
Не советуйте msdn или книгу. Справочник должен быть похож на другие стандартные справочники как у delphi, которых полно в инете, а к C#...

Интересны приемы программирования, о которых не пишут в книгах, а которые узнаются на практике
интересны приемы программирования на C# те о которых не пишут в книгах, которые узнаются на практике. какие OpenSource проекты можете...

Общие вопросы.
Доброго времени суток! После изучения Паскаля, решил перейти на изучение С/С++, прочитал много мануалов для новичков, но накопились...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
200
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru