Форум программистов, компьютерный форум, киберфорум
Наши страницы
Комментарии
Войти
Регистрация
Восстановить пароль
  1. Старый комментарий
    Аватар для Jin X
    Оптимизация кода: обходимся без ветвлений
    Добавил ещё несколько примеров (и пометил их знаком [+])
    Запись от Jin X размещена 03.05.2019 в 19:54 Jin X вне форума
  2. Старый комментарий
    Аватар для Evg
    Системные вызовы в Linux
    Если хочется писать программы на системных вызовах (я не знаю, зачем, но если вдруг), то логичнее и удобнее это делать при помощи компилятора и ассемблерных вставок. Пример тут: http://www.cyberforum.ru/assembler/thread32586-page6.html#post219569
    Запись от Evg размещена 27.03.2019 в 10:17 Evg вне форума
  3. Старый комментарий
    Аватар для Avazart
    DateTimePicker – либо дата, либо время... или нет
    Печальная штука, в C++Qt такой проблемы нет и вот интересно есть ли данная проблема в последней версии FireMonkey
    Запись от Avazart размещена 16.03.2019 в 15:13 Avazart вне форума
  4. Старый комментарий
    Аватар для Jin X
    Проверка числа на простоту – ускоряемся!
    Добавил функции is_prime7, is_prime11 (см. в спойлерах), тип изменил на unsigned int.
    Архив перезалил.
    Запись от Jin X размещена 04.03.2019 в 20:04 Jin X вне форума
    Обновил(-а) Jin X 05.03.2019 в 21:24
  5. Старый комментарий
    Аватар для Jin X
    Проверка числа на простоту – ускоряемся!
    Цитата:
    Спасибо, сохранил несколько ссылок для просмотра. А алгоритм из шапки работает с той же скоростью (потому что, по сути, на том же принципе основан), что и мой последний (is_prime5)
    Правда, на tio.run почему-то в 2 раза медленнее...

    Цитата:
    Значит, я сам того не зная, применил у себя этот wheel optimization
    Распараллеливание – это интересная идея, но полагаю, что числа должны быть достаточно большими + их должно быть несколько, иначе процесс запуска/остановки распараллеливания будет долгим.

    Кстати, я уже сделал тест Миллера (детерминированный, а не вероятностный Миллера-Рабина). Работает довольно быстро (лично у меня на компе прирост начинается с отметки примерно в полмиллиона, на tio.run эта отметка ниже).

    За решето ещё не брался
    Запись от Jin X размещена 04.03.2019 в 18:07 Jin X вне форума
  6. Старый комментарий
    Запись от bedvit размещена 02.03.2019 в 17:22 bedvit вне форума
  7. Старый комментарий
    Запись от Croessmah размещена 02.03.2019 в 14:33 Croessmah вне форума
  8. Старый комментарий
    Аватар для Jin X
    Проверка числа на простоту – ускоряемся!
    нтч, брать значение из массива (или лучше битового набора – для 1 млрд чисел нужно ≈ 120 Мб памяти) – это очевидно самый быстрый способ. Для вычисления можно даже не заморачиваться с файлом, а использовать решето Эратосфена или решето Аткина, к примеру (правда, я их ещё не тестил их на скорость).

    Но такой расход памяти не всегда оправдан. К примеру, если вам нужно лишь несколько значений из заранее неизвестного (очень широкого) диапазона. Либо если вы не знаете заранее, понадобятся ли вам эти значения – смысл держать выделенные мегабайты памяти?

    Давайте в рамках этой статьи ограничимся разовым тестом числа на простоту без предварительных расчётов. Есть же всякие тесты Миллера и пр. Вопрос только в том, насколько они быстрые и не чересчур ли сложные?
    А что касается решёт, то когда у меня дойдут до них руки, я протестирую их скорость и напишу об этом отдельную статью
    p.s. По-хорошему, надо ещё разобраться со способами факторизации числа, нахождения списка делителей (кроме самых очевидных).
    Запись от Jin X размещена 28.02.2019 в 09:32 Jin X вне форума
    Обновил(-а) Jin X 28.02.2019 в 10:08
  9. Старый комментарий
    Проверка числа на простоту – ускоряемся!
    Уважаемый Jin X,
    я решал эту задачу. И естественно нашел более быстрый и простой алгоритм. Суть его том, что в качестве делителей берутся только простые числа. Для этого объявляется массив нужного размера и заполняется простыми числами. Конкретно я брал массив длиной порядка 45000. Очевидно, что массив либо заполнялся с файла (простых чисел), либо был (инициировался) при загрузке программы.
    Вариант 2
    Вычислялись все простые числа до 2 000 000 000 и записывались в файл прямого доступа. Оставалось только проверить: находится ли данное число в файле?
    Запись от wer1 размещена 28.02.2019 в 08:02 wer1 вне форума
  10. Старый комментарий
    Аватар для Jin X
    «Карла и Джек – слаженный дуэт» или «Караоке Home Edition»
    Добавил "дополнение" про подключение 2-х микрофонов
    Запись от Jin X размещена 21.01.2019 в 19:58 Jin X вне форума
  11. Старый комментарий
    Запись от mik-a-el размещена 29.10.2018 в 14:33 mik-a-el вне форума
  12. Старый комментарий
    Аватар для Jin X
    За что я люблю Assembler?
    locm, 816 байт – это далеко не предел.
    Вот 97 байт для x86 и 286 байт для x64.
    А demo/intro пишут не только под DOS, но и даже под паяльники
    Запись от Jin X размещена 25.10.2018 в 14:20 Jin X вне форума
    Обновил(-а) Jin X 25.10.2018 в 14:23
  13. Старый комментарий
    За что я люблю Assembler?
    Цитата:
    Что же касается демосцены, то написать, скажем, intro, уместив исполняемый файл в 256 байт [1, 2, 3, 4] (а то и 128, 64, 32 или даже ещё меньше) на чём-то отличном от ассемблера вы вряд ли сможете.
    Это все конечно хорошо, только программы под DOS. Эта система давно не актуальна. Для Windows будет проблематично создать исполняемый файл PE формата такого размера, потому что в нем кроме машинного кода находятся служебные данные. На ЯВУ у меня получилось создать файл PE x86 размером 816 байт. http://www.cyberforum.ru/development/thread575620.html#post3044634
    На x64 не запускается видимо из-за нестандартного выравнивания секций.
    Запись от locm размещена 19.10.2018 в 21:37 locm вне форума
  14. Старый комментарий
    Аватар для Jin X
    Простое, но недокументированное определение производителя процессора (Intel / AMD)
    Цитата:
    вряд ли такой подход имеет практическую ценность
    Обычно недокументированные фичи производители не трогают (хотя, данная штука не так широко используется, поэтому вероятность "нарваться на неприятности", возможно, чуть выше). И конечно, такие вещи часто используют тогда, когда другими способами добиться результата нельзя или проблематично. В данном же случае, учитывая существование более надёжного (и тоже простого) метода, этот способ действительно менее предпочтителен в общем случае и больше подходит ради забавы или для общего развития.

    Цитата:
    Да и какие такие ресурсы данный подход экономит?
    Несколько областей применения придумать можно, хоть они и весьма специфичны, к примеру:
    – при обфускации кода (вариант с cpuid гораздо более очевиден),
    – при запуске на очень старых процессорах, у которых нет cpuid (386 и младше, некоторые 486), хотя это стоит всё же предварительно проверить (если у кого-то есть возможность, сделайте, плиз ),
    – в коде, где на счету каждый байт (к примеру, в демосцене),
    – вряд ли проверка процессора будет использоваться в критических к скорости циклах, но просто как факт: div работает гораздо быстрее, чем cpuid и не выполняет сериализацию.

    Собственно, эту статью я написал ради того, чтобы поделиться забавным фактом.
    А нужно это вам или нет (и для чего) – решайте сами
    Запись от Jin X размещена 15.10.2018 в 09:04 Jin X вне форума
    Обновил(-а) Jin X 15.10.2018 в 10:02
  15. Старый комментарий
    Аватар для Usaga
    Простое, но недокументированное определение производителя процессора (Intel / AMD)
    Занятно, конечно, но вряд ли такой подход имеет практическую ценность. Такое поведение в будущем может измениться, а значит подход ненадёжен.

    Да и какие такие ресурсы данный подход экономит?
    Запись от Usaga размещена 15.10.2018 в 08:06 Usaga вне форума
  16. Старый комментарий
    Аватар для Jin X
    Оптимизация кода: обходимся без ветвлений
    liv, действительно.
    Спасибо, коррективы внёс!
    Запись от Jin X размещена 29.09.2018 в 09:04 Jin X вне форума
  17. Старый комментарий
    Аватар для liv
    Оптимизация кода: обходимся без ветвлений
    Вот тут неправильный комментарий:
    ; Установить бит номер CL в регистре EAX при условии CF==1
    setc dl
    movzx edx,dl ; = cf ? 1 : 0
    shl edx,cl ; = single bit if cf
    or eax,edx ; set bit if cf
    Запись от liv размещена 21.09.2018 в 19:19 liv вне форума
  18. Старый комментарий
    Аватар для liv
    Оптимизация кода: обходимся без ветвлений
    Последний пример некорректен, надо:
    ; Выход из цикла при значении EAX == 0 или EBX > ECX
    test eax,eax
    setz dl ; = (eax==0) ? 1 : 0
    cmp ebx,ecx
    seta dh ; = (ebx>ecx) ? 1 : 0
    or dl,dh ; zf = not (eax==0 || ebx>ecx)
    jnz .break
    Запись от liv размещена 21.09.2018 в 19:08 liv вне форума
  19. Старый комментарий
    За что я люблю Assembler?
    Цитата:
    Сообщение от Jin X Просмотреть комментарий
    Спасибо!

    Раньше много чего по-другому было, биты тумблерами переключали, насколько мне известно . Я ж говорю: если хочется и вы видите в этом смысл – не вопрос. У К.К. даже есть статья про программирование в машинных кодах.

    Заменять одно другим не стоит, разумеется. Я примерно об этом и говорю в последних 2-х абзацах. Каждый инструмент должен быть применён к месту и разумно – это касается всего, не только языков программирования. Когда я пишу на чистом асме, то делаю это чаще по приколу, чем по необходимости, потому что в большинстве случаев достаточно вставок.
    Что касается высокоуровневого синтаксиса, то некоторые люди пытаются сделать что-то удобоваримое (HLA, к примеру). Но всё равно большой популярностью это не пользуется. Не могу сказать почему, ведь конструкции вроде .IF и .WHILE есть в том же masm32, и люди их вовсю применяют. Исходники на HLA выглядят вот так:
    Код:
    begin BitCnt_1;
    
    	push( ebx );
    	push( ecx );
    	mov( bits2Cnt, ebx );
    	mov( 0, eax );
    	for( mov( 32, ecx ); ecx > 0; dec( ecx )) do
    	
    		shr( 1, ebx );
    		if( @c ) then
    			
    			inc( eax );
    			
    		endif;
    		
    	endfor;
    	pop( ecx );
    	pop( ebx );
    	
    end BitCnt_1;
    
    . . .
    
    	BitCnt_1( 1234567890 );
    	if( eax <> edx ) then
    	
    		stdout.put
    		( 
    			"BitCnt_1 produced an incorrect result: ",
    			(type uns32 eax),
    			" (Should have been ",
    			(type uns32 edx),
    			")" nl
    		);
    		
    	endif;
    На любителя, конечно...
    Но конструкции вида ax = bx можно написать макросами в нормальных ассемблерах типа MASM, fasm, NASM (правда, выглядеть это будет скорее как @ax = bx или . ax = bx).
    Вот это классный язык!)
    Запись от Konst2016 размещена 30.07.2018 в 23:06 Konst2016 вне форума
  20. Старый комментарий
    За что я люблю Assembler?
    Бывают такие задачки, что их легче запрограммировать на языке ассемблера, чем на языке высокого уровня, в частности на С++. Например сцепление строки, с определенной частью другой строки, кода известно индекс первого символа и длина подстроки. При этом подстрока может быть в начале, в середине или в конце второй строки, которая задается в параметрах функции
    Запись от Melamed размещена 30.07.2018 в 14:23 Melamed вне форума
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.