• Ассемблер, почему дизассемблированном коде много ненужных операций?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему не переписать вместо этого
    add ebx,dword ptr [rbp+ECX*4+10h]

    Буквально так написать нельзя, потому что нет такого режима адресации в котором можно было бы использовать вместе Rbp (64-битный) и Ecx (32-битный). Можно было бы написать add ebx,dword ptr [rbp+rcx*4+10h], но для этого счётчик цикла должен был бы быть 64-битным, а он, как мы видим, 32-битный (int i). Т.е. ответ на вопрос "для чего это": для беззнакового расширения 32-битного счётчика цикла в регистр, который можно использовать для доступа к памяти.

    Другое дело, что из исходного кода очевидно, что при обращениях к памяти i не выходит из диапазона 0..9, так что разницы между ecx и rcx нет и не может быть. Возможно я что-то упускаю и у компилятора другое мнение на этот счёт, но может быть он просто туповат и не имеет кода который бы мог использовать эту возможность оптимизации, а может такая оптимизация и есть, но она не была включена во время генерации этого кода.
    Ответ написан
    Комментировать
  • Что быстрее SQL или Javascript?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    В общем, чтобы не издеваться над девушкой, объясним на пальцах.

    Во-первых, заголовок у вопроса чудовищно некорректный. Это все равно что спросить, "что быстрее - пылесос или стиральная машина?"
    Во-вторых, ответ на вопрос "производить ли обработку данных в БД или же запросить все данные в клиентское приложение и обрабатывать там" совершенно очевиден: обработку данных следует производить в общем случае только в БД. Она для этого и придумана. Чтобы обрабатывать значительные объемы данных.

    Да, js тоже "может" обрабатывать большие объемы данных.
    Но чтобы значительный объем данных обработать, его сначала надо передать, полностью забив канал между сайтом и базой
    Чтобы значительный объем данных обработать, его надо сначала проиндексировать. Причем делать это каждый раз, а не использовать уже имеющийся набор индексов
    Чтобы значительный объем данных обработать, надо иметь значительный объем памяти или упасть из-за её недостатка
    Чтобы значительный объем данных обработать в многопоточном режиме (а сайт как раз является многопоточной системой), все вышеперечисленное надо умножить на количество посетителей сайта - при каждом запросе перегонять весь массив данных, выделять память, индексировать, считать. Если же вы оставляете все данные в памяти приложения, то их тогда надо как-то синхронизировать с БД. То есть вы себе собираете кучу проблем на пустом месте.

    Несомненно, из любого правила есть исключения. И бывают ситуации, когда приходится считать в приложении.
    Но на вопрос в общем виде ответ будет совершенно однозначный. Не "может так, может сяк", а только в БД.
    Ответ написан
    9 комментариев
  • Как передать из функции значения в разные потоки?

    bingo347
    @bingo347
    Crazy on performance...
    Начну с того, что код представленный автором в комментах к вопросу имеет deadlock между мьютексом и recv() из канала и завершается лишь по тому, что мы не ждем фоновые потоки. Вариант без deadlock будет выглядеть так:
    fn test() {
        let mut channels = Arc::new(Mutex::new(Vec::with_capacity(PAR)));
        let mut joins = Vec::with_capacity(PAR);
        for _ in 0..N / PAR {
            for _ in 0..PAR {
                let mut channels = Arc::clone(&channels);
                joins.push(thread::spawn(move || {
                    get(channels.lock().unwrap());
                }));
            }
        }
        for j in joins {
            j.join().unwrap();
        }
    }
    
    #[inline(always)]
    fn get(mut channels: MutexGuard<Vec<mpsc::Sender<i32>>>) -> i32 {
        let (tx, rx) = mpsc::channel();
        channels.push(tx);
        if channels.len() == PAR {
            exec(channels);
        } else {
            drop(channels); // drop гварда отпускает мьютекс
        }
        rx.recv().unwrap()
    }
    
    #[inline(always)]
    fn exec(mut channels: MutexGuard<Vec<mpsc::Sender<i32>>>) {
        let mut i = 0;
        for c in channels.iter() {
            i += 1;
            c.send(1).unwrap();
        }
        println!("{}", i);
        channels.clear();
        // а здесь гвард дропнется сам
    }

    Вторая проблема в том, что все потоки выполняются по сути по очереди, так как ждут разблокировки мьютекса от других потоков, из-за чего многопоточка тут не дает никаких преимуществ, а лишь создает накладные расходы. Ради эксперимента я попробовал заменить мьютекс на еще один канал:
    fn test() {
        let (tx, rx) = mpsc::channel::<mpsc::Sender<i32>>();
        let mut handles = Vec::with_capacity(N + 1);
        handles.push(thread::spawn(move || exec(rx)));
        for _ in 0..N {
            let tx = tx.clone();
            handles.push(thread::spawn(move || {
                get(tx);
            }))
        }
        drop(tx);
        for handle in handles {
            handle.join().unwrap();
        }
    }
    
    fn get(sender: mpsc::Sender<mpsc::Sender<i32>>) -> i32 {
        let (tx, rx) = mpsc::channel();
        sender.send(tx).unwrap();
        rx.recv().unwrap()
    }
    
    fn exec(receiver: mpsc::Receiver<mpsc::Sender<i32>>) {
        let mut channels = Vec::with_capacity(PAR);
        loop {
            for _ in 0..PAR {
                let Ok(tx) = receiver.recv() else {
                    return;
                };
                channels.push(tx);
            }
            let mut i = 0;
            for c in channels.iter() {
                i += 1;
                c.send(1).unwrap();
            }
            println!("{}", i);
            channels.clear();
        }
    }
    Но особо это профита не дает, так как основной пожиратель перфоманса - switch context в ОС. Тысячи потоков делают только хуже. Запускать потоков сильно больше чем есть ядер - это вообще плохая идея. Просто ради интереса переписал еще раз на асинхронных каналах tokio:
    async fn test() {
        let (tx, rx) = mpsc::unbounded_channel::<mpsc::UnboundedSender<i32>>();
        let mut handles = Vec::with_capacity(N + 1);
        handles.push(tokio::spawn(async move { exec(rx).await }));
        for _ in 0..N {
            let tx = tx.clone();
            handles.push(tokio::spawn(async move {
                get(tx).await;
            }))
        }
        drop(tx);
        for handle in handles {
            handle.await.unwrap();
        }
    }
    
    async fn get(sender: mpsc::UnboundedSender<mpsc::UnboundedSender<i32>>) -> i32 {
        let (tx, mut rx) = mpsc::unbounded_channel();
        sender.send(tx).unwrap();
        rx.recv().await.unwrap()
    }
    
    async fn exec(mut receiver: mpsc::UnboundedReceiver<mpsc::UnboundedSender<i32>>) {
        let mut channels = Vec::with_capacity(PAR);
        loop {
            for _ in 0..PAR {
                let Some(tx) = receiver.recv().await else {
                    return;
                };
                channels.push(tx);
            }
            let mut i = 0;
            for c in channels.iter() {
                i += 1;
                c.send(1).unwrap();
            }
            println!("{}", i);
            channels.clear();
        }
    }
    и запустил в многопоточном рантайме в дефолтной конфигурации (количество воркеров == количеству ядер), работает быстрее в 19 раз.

    P.S. без I/O операций асинхронщина тоже создает ненужные накладные расходы, я ее здесь использовал только из-за простоты переписывания, лучше взять обычный thread pool с синхронными тасками.
    Ответ написан
    Комментировать
  • Где могут взять на удаленную работу разработчика игр на Unity?

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    С разморозкой.

    Эпоха (да нет, даже эра) работы "я на удаленке пашу на забугор, получаю за два часа кучу бабок, лежу под пальмой, ха-ха, все кто работает в офисе - лузеры" - закончилась. Чуть раньше чем закончился глобализм вообще, а прошлый и нынешний года ее добили окончательно и теперь додавливают остатки.

    Если ты из РФ - ты не нужен никакой зарубежной компании. Просто по факту "ты из РФ"
    Если тебе меньше 18 - ты не нужен вообще никакой компании, кроме тех, где кидают - потому что морок и проблем с трудоустройством малолеток столько, что государство квоту на лето устанавливает.
    Если у тебя нет опыта (а фрилансерство за опыт не идет) - ты не нужен вообще никакой компании независимо от возраста, потому что фрилансера очень трудно перевоспитать для работы в офисе (и чем больше у него опыта, тем труднее)

    Поэтому жди совершеннолетия и уже потом ищи что-то от геймерских контор.
    Ответ написан
    3 комментария
  • 1 гигабит интернет но торренты качат 30-40мб/сек, как увеличить скорость?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    О, тут на самом деле есть куча факторов: как правильно уже сказали - есть оборудование провайдера со своими ограничениями. Есть ограничения у вышестоящего провайдера или провайдеров, сети и линий связи. Есть маркетинг провайдера: вам могут выдать тариф 1Гбит, но по факту это будет остаток от гигабитной лини, что приходит на весь ваш дом (у меня был такой случай - через пару месяцев "обещаний" обновить оборудование ушел обратно на старого провайдера, который не зажилил поставить второй коммутатор на дом только для меня одного). Так что гигабит в ДС и на дальнем востоке - это два разных гигабита. 30-40 мегабайт скорости в торрентах на гигабитном тарифе - очень даже неплохо на самом деле.
    Ответ написан
    2 комментария
  • Как постичь искусство программирования?

    vabka
    @vabka
    Токсичный шарпист

    Ещё в студенческие годы баловался в Delphi и вёрстке, это было чертовски интересно.

    И зачем тогда себя мучать и пытаться залезть туда, куда вас вообще не тянет?


    Я пробовал начать с "Грокаем алгоритмы" и с книги Никлауса Вирта по алгоритмам, но мало что понял. Читаю и, как говорится, "Смотрю в книгу, а вижу фигу"...

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

    Это всё равно что пытаться изучать алгебру не зная арифметику и не зная, как выглядят цифры.

    Я с этим тезисом согласен.
    Ибо действительно ничего не сможешь понять.


    начал пытаться решать задачи на логику. Но такие задачи требуют смекалки и способность догадаться (что логично) до какого-то решения, оперируя данными.

    Никакой смекалки и догадок в задачах на логику нет. На то это и задачи на логику.


    искусством программирования

    Скорее придирка, но программирование и программная инженерия очень далеки от искусства.
    Называть программирование искусством - всё равно что назвать искусством покраску стен.


    В прошлом окончил ВУЗ по IT-специальности

    Оффтоп, но это показательный пример несостоятельности текущей системы образования.


    как развить абстрактно-логическое мышление?

    Школьная математика.


    Как изучить методику программирования?

    Решай хоть какие-нибудь задачи при помощи какого-нибудь языка программирования.
    Не торопись лезть на leetcode. Попробуй что-нибудь простое и чисто бытовое решить.
    Ответ написан
    1 комментарий
  • Является ли хорошей практикой использовать связку Nginx+Apache сегодня?

    ky0
    @ky0 Куратор тега Nginx
    Миллиардер, филантроп, патологический лгун
    Если точно понимаете, зачем вам Апач - почему бы и нет?

    Но, честно говоря, вариантов тут немного - чаще всего такое взгромождают, когда приложение работает только с неким экзотическим модулем апача, аналога которого для других веб-серверов не существует (см. напр. 1С). Ну или когда несколько поколений веб-программистов в три слоя обмазало сайт htaccess-магией и конвертировать это в nginx-директивы никто не хочет.
    Ответ написан
    2 комментария
  • Как понять какой запрос выбрать из всех в devtools?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Веб-разработка
    Вас этому на курсе и должны были научить.
    Для начала: у вас стоит фильтр на POST-запросы. Вы уверены, что нужный вам запрос идёт именно через POST?
    Дальше вы можете отфильтровать только XHR запросы и только на этот домен и в оставшихся пяти-семи уже, наверное, разберётесь.
    Ответ написан
    1 комментарий
  • Как сформировать AJAX запрос для базы данных?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Для начала надо научиться делать без всякого аякса и яваскрипта. А освоить базовые приемы работы с РНР.
    Сейчас же у вас дурацкий вопрос вида "как мне затонировать стекла в машине?" при том что сама машина - это помесь телеги с влосипедом, причем педали крутятся в обратную сторону.

    Сначала надо добавить одну запись в БД руками.
    Потом так же в БД учиться писать запрос SELECT
    потом учиться выполнять SQL запросы в РНР.
    потом учиться получать результат SQL запроса в массив.
    потом учиться выводить многомерный массив
    потом учиться выводить многомерный массив в виде требуемого HTML, чтобы получить свою таблицу
    после этого можно сесть и отдохнуть.

    И после хорошего отдыха начать учиться работать с формами в HTML
    и как их обрабатывать в РНР
    написав в итоге код для добавления данных формы в БД

    и только после этого, если силы останутся, навешивать рюшечки в виде запроса и обновления аяксом
    Ответ написан
    41 комментарий
  • Как работает метод max() для списка из списков?

    gedev
    @gedev
    сисадмин-энтузиаст
    Посмотрите на свой список, у вас там строки, а не числа. С числами всё работает так как вы ожидаете. А вот строки в Python сравниваются иначе — по их ASCII/Unicode кодам.
    >>> green = [[0.01775, 274903], [0.0177, 2767608], [0.01765, 1966445], [0.0176, 698199], [0.01755, 2853585], [0.0175, 944079], [0.01745, 2813977], [0.0174, 336701], [0.01735, 2118072], [0.0173, 975570]]
    >>> max(green, key=lambda x: x[1])
    [0.01755, 2853585]
    Ответ написан
    1 комментарий
  • Как спарсить whatsapp web?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Почитай сначала раздел developers. Возможно там надо зарегистрироваться и просто взять готовый API
    и пользоваться.
    Ответ написан
    Комментировать
  • Как следить за изменением авторизации пользователя?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Не надо "следить". У вас должен быть короткоживущий основной токен. Каждый раз при его обновлении проверяйте статус пользователя и не выдавайте новый токен, если пользователь заблокирован.
    Ответ написан
    Комментировать
  • Что изучать после пайтона?

    phaggi
    @phaggi
    лужу, паяю, ЭВМы починяю
    Что изучать после трактора?
    Вождение трактора.
    Ремонт трактора.
    Навесное оборудование на трактор.
    Применение трактора в сельском, городском хозяйстве, на производстве, добыче полезных ископаемых, покорение Гималаев на тракторе, построение своего трактора, гонки на тракторах, моделирование тракторов 1:43, продажа и страхование тракторов, обучение других тракторам, написание книги о тракторах, утилизация тракторов.
    Ответ написан
    2 комментария
  • По какой причине __init__.py часто оставляют пустым?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    Изучаю различные репозитории
    - а надо изучать азы Python, а потом уже "различные" репозитории.
    По какой причине __init__.py часто оставляют пустым?64c948f950df5147587603.png

    Файл пакета __init__.py
    Ответ написан
    Комментировать
  • Как быстро изучить C#?

    @tukreb
    Быстро изучить просто.
    Придумывайте любой проект и начинаете его делать.
    И самое главное, вы должны делать это самостоятельно, без всяких тостеров.
    Книги вам помогут любые где есть просто базовые знания, а вот всякие ютуб каналы особо не помогут, может только чуть разобраться в фреймворках, но всё равно документация рулит.
    Если хотите создавать игры, то копайте движок Unity и его документацию.

    Сам процесс простой.
    1. Пишите как знаете проект, главное чтобы заработало как планируете, на сам код не обращайте особого внимания.
    2. Начинаете переписывать проект с полученным опытом из 1 пункта с использование новых знаний из прочтения книг по всяким архитектурам и паттернам.
    3. Повторяете в цикле первые 2 пункта до 11 класса каждый день тратя по 4 часа минимум.

    Весь ваш прогресс заносите через git на гитхаб, пригодится, когда будете искать работу.
    Ответ написан
  • Какова разница 5 и 6 издания книги Изучаем Python - Марк Лутц?

    Разница в том, что одно существует, а другое — нет.
    Ответ написан
    Комментировать
  • Что нужно знать, чтобы устроиться на позицию Python Junior?

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    То, что требует работодатель :) Требования могут здорово отличаться. Ну и кроме того, нужно знать некоторые соседние дисциплины, если их знание подразумевается - например при программировании для сети нужно иметь хотя бы элементарные познания в сетевых технологиях.
    Ответ написан
    Комментировать
  • Как в Windows сделать несколько копий каталогов под разными названиями?

    sergey-kuznetsov
    @sergey-kuznetsov
    Автоматизатор
    Создайте файл script.cmd в папке main
    @echo off
    for %%l in (en kz au cz th) do (
        xcopy /E /I /Q /Y ru %%l
    )
    Затем перейдите в командной строке CMD в эту папку и запустите скрипт.

    Вот то же самое, но через создание символических ссылок.
    @echo off
    for %%l in (en kz au cz th) do (
        mklink /D %%l ru
    )
    Но тут потребуется запускать командную строку от имени администратора, иначе ссылки не создадутся.
    В итоге у вас одно и то же содержимое отобразится в нескольких новых папках. И если изменить файл в любой папке, то это изменение повторится во всех остальных.

    main
    │   script.cmd
    ├───au
    │   └───dir
    │       │   index.html
    │       ├───css
    │       └───js
    ├───cz
    │   └───dir
    │       │   index.html
    │       ├───css
    │       └───js
    ├───en
    │   └───dir
    │       │   index.html
    │       ├───css
    │       └───js
    ├───kz
    │   └───dir
    │       │   index.html
    │       ├───css
    │       └───js
    ├───ru
    │   └───dir
    │       │   index.html
    │       ├───css
    │       └───js
    └───th
        └───dir
            │   index.html
            ├───css
            └───js
    Ответ написан
    3 комментария
  • Клиент, запущеный раньше сервера к нему не подключаеться. Как исправить?

    Vindicar
    @Vindicar
    RTFM!
    Я не понял зачем ты пытаешься подключиться к серверу в отдельном потоке. Если это критично, почитай про неблокирующие операции на сокетах, и как ими пользоваться.

    Да ещё и глотаешь исключения. Очень не советую писать except: pass, у тебя вместо сколь-нибудь понятного сообщения об ошибке программа будет молча не работать.

    В любом случае ты делаешь только одну попытку подключения. Поток выполнит try_connect() один раз и завершит работу. Отсюда и наблюдаемое поведение - клиент не переконнектится, потому что в коде это не прописано.
    Ответ написан
    Комментировать
  • С чего начать изучения сетевого программирования?

    @res2001
    Developer, ex-admin
    Классика жанра - книга Стивенса "UNIX. Разработка сетевых приложений"
    Книга старая, по моему последнее издание 2007 года. В сети есть в электронном виде. Если повезет можно купить в букинистических магазинах.
    Хоть она и старая, но все описанное вполне живо и активно используется. Там примеры на Си. Но в шарпе и во всех других ЯПах принципы сетевого программирования одни и те же, т.к. используют для реализации обмена средства, предоставляемые ОС, а в книге описаны именно они.

    UPD: Если что, то под виндой все то же самое. Конечно, есть свои нюансы местами, но не критично.
    Ответ написан
    Комментировать