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

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

27.03.2021, 15:34. Показов 32855. Ответов 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
Эксперт по электронике
6850 / 3274 / 339
Регистрация: 28.10.2011
Сообщений: 12,802
Записей в блоге: 7
06.04.2021, 23:15
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Замабувараев Посмотреть сообщение
Не очень‐то вяжется с вашим динамическим массивом, особенно с учётом того, что старым указателем пользоваться уже нельзя.
Вы где-то видите работу с указателями?
PureBasic
1
2
Dim x(100)
ReDim x(100000)
Сделайте аналог динамического массива с хранением в стеке. Точнее сделайте так чтобы FB использовал Dim и ReDim. Посмотрим чего стоит перегрузка операторов/ключевых слов в FB.

Цитата Сообщение от The trick Посмотреть сообщение
Динамическую строку можно выделить в стеке, Замабувараев написал уже
То есть осовободить память в стеке нельзя и придется новой выделять память! Слишком нерационально учитывая что стек не резиновый. Имеет смысл есть есть поддержка со стороны ЯП и точно известно что строка небольшого размера и не вызовет переполнение стека.

Цитата Сообщение от The trick Посмотреть сообщение
Dim z As StringOnStack
StringOnStack это что?
Как реализовано в ЯП?
Или сферический в вакууме тип?
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
06.04.2021, 23:36
Цитата Сообщение от locm Посмотреть сообщение
То есть осовободить память в стеке нельзя и придется новой выделять память! Слишком нерационально учитывая что стек не резиновый. Имеет смысл есть есть поддержка со стороны ЯП и точно известно что строка небольшого размера и не вызовет переполнение стека.
Ну я уже написал об ограничениях. А вообще в хипе также память выделяется. Вот ты выделил блок, нужно тебе увеличить блок, если место за текущим блоком занято, то менеджер хипа тот блок оставит и будет искать другой, тот блок будет помечен на удаление. Как блок найдется, старые данные будут скопированы в новый блок и функция вернет новый указатель.

Цитата Сообщение от locm Посмотреть сообщение
StringOnStack это что?
Как реализовано в ЯП?
Или сферический в вакууме тип?
Да это просто пример в каких ситуациях эффективно использовать строку в стеке. Это же очевидно.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
07.04.2021, 05:52
Ребята, вы, по-моему, попали в ловушку собственных предубеждений.

Уже в ход идут какие-то совсем абсурдные вещи про кэш. Это прям уже реально смешно.
Вы пытаетесь сравнить аллокацию памяти так, как будто любой кодер это будет делать прямо в коде
и микро кусками, т.е. кодер у вас по умолчанию - полный баран и днище. Вы упираете на время
аллокации и деаллокации, хотя вроде понятно, что деаллокация менее затратная процедура, а
аллокацию памяти можно делать в самом начале.
Также упускается из виду то, что можно сделать аналог кэша, не трогая при этом никакие ключи
компилятора завести его в самом начале программы, когда пользователь по большей части ждёт запуска
программы и использовать точно так же как стек выделяя память парой инструкций процессора,
точно также подгрузив указатель из переменной и далее уже работая с регистром т.е. одной командой,
причём возвращать указатель будет не нужно, т.к. это не стек, тут нет такой вещи как "ожидание
данных стека другими частями кода, куда оно свои данные положили". И вот мы подошли к самому главному
написанному и поэтому.

Цитата Сообщение от Замабувараев Посмотреть сообщение
Давайте сравним выделение памяти в куче и стэке.
Давайте:

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

Теперь пройдёмся по вашим косякам:


Цитата Сообщение от Замабувараев Посмотреть сообщение
3. Данные в стэке лежат прямо вместе с кодом и легко умещаются в кеш процессора.
Во-первых, данные в стеке не лежат вместе с кодом, адреса там "вдали" на целый дефолтный мегабайт. А во-вторых:

Цитата Сообщение от The trick Посмотреть сообщение
Ну это не отменяет того что данные в кэше будут.
Осталось понять в каком кэше, если я запущу на первом\втором\третьем\четвёртом пеньке, они будут?
Кэш размером с мегабайт, допустим ты заведёшь почти весь его, ну начнёшь в хост и в гриву резвиться.
На моём P4 в 3GHz общий кеш был на один мегабайт, общий означает что и на код и на данные, но если разбить
его на это разделение, то выйдет так что то про что мы говорим туда не попадёт при всё таки.
У меня например хороший рабочий вариант ноута 3-го пня(целерон) с 98 виндой. Я тоже могу как
Замабувараев сказать про bloatware. Но все мы прекрасно знаем, если запустить допустим старые
игры под DOS или Windows до нулевых сделанные, то можно заметить что чудесным образом они работают
всё же быстрее со временем даже на новых, это означает что "те самые" оптимизации ещё актуальны.
Причём ускорение значительно, можно привести в пример hioctane с полностью софтверным движком.

Цитата Сообщение от The trick Посмотреть сообщение
2
Dim z As StringOnStack
z = a & foo() & c & d
А если пользователь псих и решит конкатенировать строки размером в пару сотен мгабайт)))?
Наслушается тут советов про скорость и на полном серьёзе захочет. Давать это на откуп?
Или это неправильное использование строки? А если у чувака такая задача, загнать длинную строку
и организовать в ней поиск.

Выходит так, что все эти бенефиты сводятся на нет. Мы на ровном месте получаем геморрой:
1) Ту же самую необходимость в проверках размера свободной памяти, про которую обсуждение уже дошло
аж до критических секций.
2) п1. тянет за собой необходимость подгружать это в регистр и сравнивать - теряем регистр
в алгоритме где он может быть критически важен, причём это уже второй регистр, от ebp мы типа отказались.
Ну т.е. гоняем туда сюда переменные память-регистры-память регистры, у нас же проц времени дофига
и нам не важен ни объём кода, ни кол-во операций, конвееры толстые - справятся.
3)
4. Данные в куче лежат неизвестно по каким адресам, и чтобы до них добраться, процессору может потребоваться сбросить кеш.
Выше приведены аргументы, почему оно может не закэшироваться.
Ещё стоит учесть что кэш разбивается по ядрам ЦП, поэтому его значение даже в современных машинах не
такое уж и большое, даже там могут случатся кэш промахи.
Ещё во всей этой истории с кэшем наверное стоит учесть и то, что прирост будет от кэша инструкций,
а там я у парней видел такие штуки как CALL. Хотите оптимизировать, так оптимизируйте.
Пока тут оптимизацией не пахнет даже.
4)
Цитата Сообщение от The trick Посмотреть сообщение
Есть конечно и недостатки, такие как ограниченный размер + нельзя возвращать
такую память из функции, ну еще некоторые ограничения.
Добавлено через 12 минут
5) И разумеется всё это, особенно про кэши когда разговор, требует не просто высочайшей квалификации
именно на низком уровне, но ещё и приличный тестерский штат ПК у кодера. Простотой тут вообще нифига
не пахнет. И той халявой про которую якобы речь идёт, мол выдели переменные в стеке и радуйся
будет супер пупер быстро и ичего больше делать не надо, алгоритмы сами собой заработают быстро.

6) Всякие любители рекурсий, готовые библиотеки-чёрные ящики с сам бог знает чем внутри и мол на сколько
оно способно "поддёрнуть" стек. Уповать на удачу, что там всё ровненько, чистенько с проверочками и без
сильных аппетитов.

Добавлено через 36 минут
Мегабайт это не так много, как некоторые считают. Под DOS'ом можно было спокойно выделить 9 сегментов
памяти в коде. Т.е. 576 килобайт. Тут всего лишь в два раза больше. Не так-то и много.
Рекурсию не пишу принципиально - мне не страшно, а вот те кто пристрастились, тут не знаешь
где и как человек напортачит. Её часто, как раз и применяют в таких вещах, глубины которых
не особо секут. А не зная броду как говорится...
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
07.04.2021, 10:12
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Уже в ход идут какие-то совсем абсурдные вещи про кэш. Это прям уже реально смешно.
Вы пытаетесь сравнить аллокацию памяти так, как будто любой кодер это будет делать прямо в коде
и микро кусками, т.е. кодер у вас по умолчанию - полный баран и днище.
Нет. Вам показывают что выделение в стеке в некоторых случаях более выгодно и намного эффективнее как по скорости так и по ресурсам, а вы нас пытаетесь переубедить в этом.

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

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

Цитата Сообщение от Quiet Snow Посмотреть сообщение
тут нет такой вещи как "ожидание
данных стека другими частями кода, куда оно свои данные положили"
Нет никакого ожидания данных стека, что за абсурд?

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

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

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

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

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

Цитата Сообщение от Quiet Snow Посмотреть сообщение
Ещё во всей этой истории с кэшем наверное стоит учесть и то, что прирост будет от кэша инструкций,
а там я у парней видел такие штуки как CALL. Хотите оптимизировать, так оптимизируйте.
Пока тут оптимизацией не пахнет даже.
При чем тут это? Или что CALL AllocateMemory быстрее будет чем SUB ESP?

Цитата Сообщение от Quiet Snow Посмотреть сообщение
Простотой тут вообще нифига
не пахнет. И той халявой про которую якобы речь идёт, мол выдели переменные в стеке и радуйся
будет супер пупер быстро и ичего больше делать не надо, алгоритмы сами собой заработают быстро.
Конечно не пахнет простотой, особенно для тех кто сам себе привык придумывать проблемы

Цитата Сообщение от Quiet Snow Посмотреть сообщение
Всякие любители рекурсий, готовые библиотеки-чёрные ящики с сам бог знает чем внутри и мол на сколько
оно способно "поддёрнуть" стек. Уповать на удачу, что там всё ровненько, чистенько с проверочками и без
сильных аппетитов.
С рекурсией и потоками как раз в стеке все нормально если следовать рекомендациям. А вот с вашими с хулиганом рекомендациями с какой-то левой памятью, которую нужно там отслеживать и т.п. как-раз все грустно.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
07.04.2021, 12:00
Цитата Сообщение от The trick Посмотреть сообщение
Нет никакого ожидания данных стека, что за абсурд?
Ахах, прикольно. Я только что узнал что можно просто выкинуть push\pop и не пользоваться ими.

Всё сами разгребайтесь со своим пониманием, мне хватило.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
07.04.2021, 12:02  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Посмотрим чего стоит перегрузка операторов/ключевых слов в FB.
Вы опять путаете statements и operators. Statements не перегружаются, перегружаются operators.

Цитата Сообщение от locm Посмотреть сообщение
Вы где-то видите работу с указателями?
Вы сейчас всерьёз утверждаете, что ваши массивы реализованы без указателей на память? Как тогда реализованы ваши массивы?

Цитата Сообщение от locm Посмотреть сообщение
Dim x(100)
ReDim x(100000)
Как работает ваш массив если старую память расширить не удаётся?

Цитата Сообщение от locm Посмотреть сообщение
Имеет смысл есть есть поддержка со стороны ЯП
Во FreeBASIC поддержка есть, потому что функция alloca возвращает указатель на память, а указатели поддерживаются в FreeBASIC.
Я правильно понимаю, что вам нужен особый синтаксис под каждую отдельную сущность? Вот скажите мне, ваш язык поддерживает адресную книгу с номерами незнакомок? Не надо мне предлагать список или map с некими структурами, мне нужна конкретно адресная книга для номеров незнакомок.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
07.04.2021, 12:09
Цитата Сообщение от The trick Посмотреть сообщение
Странно что ты об этом не знаешь
Да я ваще дно, просто от балды всё это пишу, а проги писал дядя Вася.
0
Эксперт по электронике
6850 / 3274 / 339
Регистрация: 28.10.2011
Сообщений: 12,802
Записей в блоге: 7
07.04.2021, 12:34
Цитата Сообщение от The trick Посмотреть сообщение
менеджер хипа тот блок оставит и будет искать другой
Этот блок сможет использовать другая программа. В стеке так не получится иначе придется написать смой менеджер памяти на основе стека.

Цитата Сообщение от Замабувараев Посмотреть сообщение
Вы сейчас всерьёз утверждаете, что ваши массивы реализованы без указателей на память?
Вы в коде видите указатели?

Цитата Сообщение от Замабувараев Посмотреть сообщение
Как работает ваш массив если старую память расширить не удаётся?
Программируя на бейсике вам часто приходится задаваться вопросом что будет если в ReDim укзать размер массива больше чем был?
Это задача компилятора/интерпретатора.

Цитата Сообщение от Замабувараев Посмотреть сообщение
Во FreeBASIC поддержка есть
Код можно чтобы посмотреть как реализовано?

Цитата Сообщение от Замабувараев Посмотреть сообщение
потому что функция alloca возвращает указатель на память, а указатели поддерживаются в FreeBASIC.
Гениально! Теперь вам осталась самая малость - научить компиль FB использовать alloca для динамических массивов и строк.
Или предлагаете все на указателях? Спасибо, но я пишу на бейсике не для того чтобы программы были в стиле Си.

Цитата Сообщение от Замабувараев Посмотреть сообщение
Не надо мне предлагать список или map с некими структурами, мне нужна конкретно адресная книга для номеров незнакомок.

Не по теме:

То есть книга с номерами знакомок не нужна? :D


В принципе под задачу подойдет ассоциативный массив.
PureBasic
1
2
3
4
NewMap Book()
 
Book("Незнакомка 1") = 789555123
Book("Незнакомка 2") = 789555124
Получение списка незнакомок и их номеров телефонов
PureBasic
1
2
3
ForEach Book()
  Debug MapKey(Book()) + " - телефон: " + Book()
Next
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
07.04.2021, 12:47
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Я только что узнал что можно просто выкинуть push\pop и не пользоваться ими.
А при чем тут эти команды? Никто не говорит что их нужно выкидывать, ты о чем вообще? Тебе написал про абсурд по поводу какого-то ожидания стека.

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

Цитата Сообщение от locm Посмотреть сообщение
Этот блок сможет использовать другая программа. В стеке так не получится иначе придется написать смой менеджер памяти на основе стека.
А про стек никто обратного не утверждал. Насчет другой программы, это только в контексте текущего процесса, т.е. программа в данном случае это код текущего процесса. Другой момент это то что стек для каждого потока свой, хип тоже можно сделать для каждого потока свой, но обычно используют один хип (системный) и доступ к нему нужно синхронизировать - это накладные расходы.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
07.04.2021, 15:55
Цитата Сообщение от locm Посмотреть сообщение
В принципе под задачу подойдет ассоциативный массив
А если ещё и структуру туда прикрутить, то вообще бомба!
PureBasic
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
Structure stranger
    Weight.f
    breast_ize.l
    phone.s
    age.b
EndStructure
NewMap Book.stranger()
    
  Book("Валя")\Weight = 50.5
  Book("Валя")\age = 27
  Book("Валя")\breast_ize = 3
  Book("Валя")\phone = "+789555123"
  
  Book("Снежанна")\Weight = 57.2
  Book("Снежанна")\age = 25
  Book("Снежанна")\breast_ize = 4
  Book("Снежанна")\phone = "+789533527"
  
  Book("Зинаида")\Weight = 60.5
  Book("Зинаида")\age = 30
  Book("Зинаида")\breast_ize = 4
  Book("Зинаида")\phone = "+7895869120"
  
 
  ForEach Book()
    Debug "Имя: "+MapKey(Book())
    Debug "Телефон: "+Book()\phone
    Debug "Вес: "+Str(Book()\Weight)
    Debug "Размер груди: "+Str(Book()\breast_ize)
    Debug"+++++++++++++++++++++++++++"
  Next
Замабувараев, задолбаешься такое на указателях творить
А тут красота, понадобилась ещё один параметр, например "Рост", вписал его в готовую структуру, и вот уже всё готово без переделки остального кода.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
07.04.2021, 18:20  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
NewMap Book()
Ну Я же спрашивал не какие‐то ньюмапы, а адресную книгу с номерами незнакомок. В вашем языке нету NewSecretAdmirersAddressBook.


Цитата Сообщение от locm Посмотреть сообщение
Вы в коде видите указатели?
Да. Все эти Dim, ReDim, Preserve, Erase — это лишь оболочки, из которых торчат уши malloc, realloc, memcpy и free над указателями.
Или массивы в вашем языке реализованы без указателей?


Цитата Сообщение от locm Посмотреть сообщение
Это задача компилятора/интерпретатора.
Нет конечно. Задача компилятора не выдумывать отсебятины, а заменить эти ключевые слова на вызов соответствующих malloc, realloc, memcpy и free. Ничего больше.


Цитата Сообщение от locm Посмотреть сообщение
Код можно чтобы посмотреть как реализовано?
1. Я уже выкладывал сюда пример использования alloca и её ассемблерный код.
2. Я взял библиотечную функцию, как там это реализовано — меня не волнует. Вы сами сказали почему это волновать не должно:
Цитата Сообщение от locm Посмотреть сообщение
Это задача компилятора/интерпретатора.
Цитата Сообщение от locm Посмотреть сообщение
Теперь вам осталась самая малость - научить компиль FB использовать alloca для динамических массивов и строк.
Вы просили показать как через alloca можно выделить память на стэке, Я показал.
Всё, задача выделения памяти на стэке решена.
Вы хотите, чтобы функции из рантайма которые работают с памятью в привязке с кучей, работали на стэке? Этого не будет.

Добавлено через 1 час 50 минут
Давайте поговорим эффективность сети в PureBasic.

Отправка данных не больше 65535 байт за раз, а для UDP и того меньше — не более 2 килобайт за раз (Я не шучу).

ID клиентов и серверов хранятся в неком глобальном списке, а это значит, что где‐то внутри есть как минимум критическая секция или вообще мьютекс, для синхронизации между потоками. Это означает, что даже если вы запустили несколько потоков, то программа всё равно в неожиданных местах превращается в однопоточную.

Реализация сервера из примера грузит процессор на 100%. Потому что «есть ли данные» проверяется в цикле! А чтобы не грузить процессор, приходится делать задержки между проверками.

Никакой асинхронности. Вы не можете сказать: «Вот тебе буфер, как данные придут, положи их в буфер и сделай уведомление».

Нет пула рабочих потоков, никаких epoll-IOCP.

Цитата Сообщение от locm Посмотреть сообщение
Торрент-клиент на PB. Торрент клиент
Устанавливаются тысячи соединений как TCP так UDP. Все в одном потоке.
Глядя на последнюю версию торрентокачалки, легко обнаружить там ВинАПИ. Кроссплатформенность©®™ рушится прямо на моих глазах.
0
Эксперт по электронике
6850 / 3274 / 339
Регистрация: 28.10.2011
Сообщений: 12,802
Записей в блоге: 7
07.04.2021, 19:56
Цитата Сообщение от Замабувараев Посмотреть сообщение
Ну Я же спрашивал не какие‐то ньюмапы, а адресную книгу с номерами незнакомок. В вашем языке нету NewSecretAdmirersAddressBook.
Может Вы еще хотите ЯП с единственным ключевым словом СделайВсеЗаМеняИЧтобыБылоКруто?
Написал его и комп сам догадался что нужно и сделал.

Цитата Сообщение от Замабувараев Посмотреть сообщение
Да. Все эти Dim, ReDim, Preserve, Erase — это лишь оболочки, из которых торчат уши malloc, realloc, memcpy и free над указателями.
Ага, а WinAPI это оболочка над ядром. Процессор состоит из транзисторов, которые в свою очередь сделаны из кремния с атомарной массой 28,085, находящегося на 14 позиции в таблице Менделеева.
Только нужно ли это знать чтобы написать программу. С указателями также. По сути это просто адреса ячеек памяти т. к. массив нужно где-то хранить.
Где он находится знать необязательно.

Цитата Сообщение от Замабувараев Посмотреть сообщение
Всё, задача выделения памяти на стэке решена.
Вы же предлагали использовать стек для динамических массивов и строк. Так что не решена.

Цитата Сообщение от Замабувараев Посмотреть сообщение
Вы хотите, чтобы функции из рантайма которые работают с памятью в привязке с кучей, работали на стэке? Этого не будет.
Ну вот вы предлагаете использовать стек для динамических массивов и строк. Хоть раз использовали? Код можно посмотреть?

Цитата Сообщение от Замабувараев Посмотреть сообщение
Давайте поговорим эффективность сети в PureBasic.
Что вы к PB прицепились и пытаетесь найти недостатки?

Цитата Сообщение от Замабувараев Посмотреть сообщение
ID клиентов и серверов хранятся в неком глобальном списке, а это значит, что где‐то внутри есть как минимум критическая секция или вообще мьютекс, для синхронизации между потоками.
Предположим синхронизация занимает 0.000000001 сек. Это сильно скажется на производительности?

Цитата Сообщение от Замабувараев Посмотреть сообщение
Глядя на последнюю версию торрентокачалки, легко обнаружить там ВинАПИ.
Потому что при его разработке кроссплатформенность не требовалась. WinAPI не много относительно остального кода.
1
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
08.04.2021, 21:45  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Может Вы еще хотите ЯП с единственным ключевым словом СделайВсеЗаМеняИЧтобыБылоКруто?
Написал его и комп сам догадался что нужно и сделал.
Так это вы хотите, чтобы всё было в языке, включая список с номерами незнакомок и тайных воздыхательниц. Концепцию, чтобы это было в библиотеке, вы не приемлете.

Цитата Сообщение от locm Посмотреть сообщение
Где он находится знать необязательно.
Вы строго требуете использования функции realloc для реализации изменения массива и ни в коем случае не связки malloc+memcpy+free, но теперь вы заявляете, что вам необязательно знать как массивы устроены внутри. Какая непоследовательность.


Цитата Сообщение от locm Посмотреть сообщение
Предположим синхронизация занимает 0.000000001 сек. Это сильно скажется на производительности?
Да, скажется. Написать что‐то серьёзное, например, бота для торговли на бирже уже не получится.

Цитата Сообщение от locm Посмотреть сообщение
Что вы к PB прицепились и пытаетесь найти недостатки?
Потому что здесь ищем эффективные пути решения задач. Я обнаружил в рантайме PureBasic существенный изъян.

Цитата Сообщение от locm Посмотреть сообщение
Ну вот вы предлагаете использовать стек для динамических массивов и строк. Хоть раз использовали? Код можно посмотреть?
Я же выкладывал пример кода раньше, но повторю.

Во FreeBASIC можно укорачивать строки, их длина изменяется:

PureBasic
1
2
3
4
5
6
7
8
9
10
11
' Стока с фиксированной длиной создаётся в стэке
' длина должна быть константой
Dim wsz As WString * (265 + 1) = Any
' В строке 0 символов
wsz[0] = 0
 
' Теперь строка содержит 11 символов
wsz = "Hello World"
 
' Обрезаем до 5 символов
wsz[5] = 0
А вот так можно сделать строку с произвольной длиной:

PureBasic
1
2
3
Dim pMemory As Any Ptr = Alloca(BytesCount)
Dim pwsz As WString Ptr = CPtr(WString Ptr, pMemory)
*pwsz = "Hello World"
В PureBasic строки после создания не могут изменить длину. Или могут? Может ли строка в PureBasic содержать нулевой символ?

(Во вложении пример, демонстрирующий создание как WString произвольной длины на стэке, так и BSTR на стэке. Ссылка на гитхуб https://github.com/zamabuvaraeu/test )
Вложения
Тип файла: zip trunk.zip (80.2 Кб, 5 просмотров)
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
09.04.2021, 08:25
Цитата Сообщение от Замабувараев Посмотреть сообщение
А вот так можно сделать строку с произвольной длиной:
QBasic/QuickBASIC
1
2
3
DIM pMemory AS ANY Ptr = Alloca(BytesCount)
DIM pwsz AS WString Ptr = CPtr(WString Ptr, pMemory)
*pwsz = "Hello World"
Извиняюсь, разрешите поинтересоваться в целях повышения образованности, чем ВАШЕ присвоение значения переменной отличается от такого:
Code
1
sHiWd$ = "Hello World"
Или вот, так в строке 0 символов
Code
1
sHiWd$ = ""
А теперь 5:
Code
1
sHiWd$ = "Hello"
1
Эксперт по электронике
6850 / 3274 / 339
Регистрация: 28.10.2011
Сообщений: 12,802
Записей в блоге: 7
09.04.2021, 09:58
Цитата Сообщение от Замабувараев Посмотреть сообщение
Так это вы хотите, чтобы всё было в языке, включая список с номерами незнакомок и тайных воздыхательниц.
Это вы хотите...

Цитата Сообщение от Замабувараев Посмотреть сообщение
Вы строго требуете использования функции realloc для реализации изменения массива
Я про пишу про динамические строки и массивы в стеке, а не про функцию realloc. Которые кстати предложили вы.

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

Цитата Сообщение от Замабувараев Посмотреть сообщение
Я обнаружил в рантайме PureBasic существенный изъян.
Если поискать в FB изъяны, уверен их можно много найти, но мне это не нужно. Зачем вам нужно искать недостатки PB?

Цитата Сообщение от Замабувараев Посмотреть сообщение
Во FreeBASIC можно укорачивать строки, их длина изменяется:
Размер выделенной памяти в стеке от этого не меняется.

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

Цитата Сообщение от Замабувараев Посмотреть сообщение
В PureBasic строки после создания не могут изменить длину. Или могут? Может ли строка в PureBasic содержать нулевой символ?
Строки динамические, т. е. можно написать.
PureBasic
1
2
s.s = "1234"
s+ "5678" + s
Цитата Сообщение от Замабувараев Посмотреть сообщение
Во вложении пример, демонстрирующий создание как WString произвольной длины на стэке
И что тут делается со строкой?
Visual Basic
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
#include once "windows.bi"
#include once "TestStackAllocation.bi"
#include once "WriteString.bi"
 
Const HelloWorld = WStr("Hello World!")
Const Caption = WStr(!"Test Alloca function successful\r\n")
 
#ifdef WITHOUT_RUNTIME
Function EntryPoint()As Integer
#else
Function main Alias "main"()As Long
#endif
    
    Dim RetValue As Integer = Any
    
    Dim RetCode As Integer = TestStackAllocationW(HelloWorld)
    
    If RetCode = 0 Then
        RetValue = 2
    Else
        RetValue = 3
    End If
    
    Dim hr As HRESULT = WriteStringW( _
        StrPtr(Caption), _
        Len(Caption) _
    )
    If FAILED(hr) Then
        Return 4
    End If
    
    Return RetValue
    
#ifdef WITHOUT_RUNTIME
End Function
#else
End Function
#endif

Не по теме:

Сишники нервно курят в сторонке...

1
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
09.04.2021, 14:51  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
чем ВАШЕ присвоение значения переменной отличается от такого:
Пока всё идёт нормально. Но стоит копнуть глубже, и уже оказывается, что строки не настолько динамические:

PureBasic
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
Procedure TestValueString()
  Hello.s = "Hello World!"
  World.s = "ThereIsString"
  
  *pHello1 = @Hello
  
  Hello.s = ""
  *pHello2 = @Hello
  
  If *pHello1 = *pHello2
    Debug "Это та же самая строка"
  Else
    Debug "Это уже другая строка!"
  EndIf
  
  Hello.s = "Hello World!"
  
  *pHello2 = @Hello
  
  If *pHello1 = *pHello2
    Debug "Это та же самая строка"
  Else
    Debug "Это уже другая строка!"
  EndIf
  
EndProcedure
Выводит:
Code
1
2
Это та же самая строка
Это уже другая строка!
Цитата Сообщение от locm Посмотреть сообщение
Нет, это все та же статическая строка, только с явным выделением памяти.
Догадайтесь что будет если записать в такую строку больше символов чем выделено памяти?
Вот видите, строка пересоздаётся, а не динамически расширяется. Хотя казалось бы, буфер позволяет. Но проблема здесь не в этом.
Проблема в том, что взятие указателя вроде бы на одну и ту же переменную даёт разные результаты. Вы не можете пользоваться указателем до конца процедуры, потому что в любой некотролируемый момент он начнёт ссылаться на мусор.

Проверил и это:
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Procedure TestValueString()
  Hello.s = "1234"
  World.s = "ThereIsString"
  
  *pHello1 = @Hello
  
  Hello.s + "5678" + Hello.s
 
  *pHello2 = @Hello
  
  If *pHello1 = *pHello2
    Debug "Это та же самая строка"
  Else
    Debug "Это уже другая строка!"
  EndIf
EndProcedure
Выдаёт «Это уже другая строка!»

Цитата Сообщение от locm Посмотреть сообщение
Докажите.
Пока вы будете выходить из блокировки, цена в биржевом стакане изменится, все несут убытки. Думаете, просто так заменяют витую пару на оптику от серверов с ботами и ведут её напрямую к серверам биржи.

Цитата Сообщение от locm Посмотреть сообщение
И что тут делается со строкой?
Не тут, а внутри функции TestStackAllocationW из файла «Modules\TestStackAllocation.bas». На больших данных падает, на маленьких работает.

Цитата Сообщение от locm Посмотреть сообщение
Если поискать в FB изъяны, уверен их можно много найти
О, Я много чего оттуда хочу выкинуть и чего добавить. Но тогда адепты культа Того Самого Бейсика©®™ будут возмущены.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
09.04.2021, 14:53
Цитата Сообщение от locm Посмотреть сообщение
Если поискать в FB изъяны, уверен их можно много найти
Да их там дохренище. В этом вообще не суть, если бы всё зависело от диалекта, на нём бы никто не писал.
В случае с PB тоже самое, но софт пишется only прямыми лапками.

Цитата Сообщение от Замабувараев Посмотреть сообщение
' Обрезаем до 5 символов
wsz[5] = 0
Думаю над locm'ом так не надо издеваться. Он ведь понимает что тут происходит.
Мы завели строку а потом посереди неё один из байтов нарекли нолём. Классический подход zstring.
Память мы не освободили таким образом. Если мы хотим строку и усечь и увеличить, то есть два пути
1) завести памяти столько, на сколько нам нужно, чтобы увеличить строку, т.е. нужно получить
длины слепливаемых строк, сложить, завести память, скопировать туда наши строки и удалить исходную.
2) сделать реаллок с сохранением данных, если используемая структура позволяет.

Это всё на уровне алгоритма, а не на уровне того, что мы используем из памяти.
Есть ещё один подход, гибридный, который как раз и использую, но тут все умненькие сами догадаетесь.
Но охотно рассмотрю любые догадки.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
09.04.2021, 15:25
Цитата Сообщение от Замабувараев Посмотреть сообщение
Выводит:
КодВыделить код
Это та же самая строка
Это уже другая строка!
Враньё!
В этом случае одна и та же строка.

Вложение 1242863
Миниатюры
Общие вопросы и приёмы эффективного программирования на BASIC  
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
09.04.2021, 15:32
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Мы завели строку а потом посереди неё один из байтов нарекли нолём.
То же самое я сделал, когда в своём сообщении выложил код
PureBasic
1
2
sHiWd$ = "Hello World"
sHiWd$ = "Hello"
Воспользуйся инструментом в Отладчике - Просмотр памяти. Там чётко видно, что строка осталась, но после Hello встал 0.

Нет ни какой необходимости городить всю эту чушь, что Замабувараев порой пишет.
2
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
09.04.2021, 16:26
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Враньё!
В этом случае одна и та же строка.
Не враньё:


Цитата Сообщение от Pro_grammer Посмотреть сообщение
То же самое я сделал, когда в своём сообщении выложил код
Не тоже самое. У тебя при каждом вызове идет обращение куче и переопределение памяти, а также копирование строки. То что отладчик показывает одну и ту же память - ничего не значит, просто хип возвращает тот же самый блок.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.04.2021, 16:26
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
160
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru