Задать вопрос
  • Почему скорость битовых операций отличается в 1000 раз?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Скорее всего, обращение к массиву тормозит. Там, видимо, еще и проверки на попадание в границы массива происходят.

    Если вы место обращения к массиву будете делать currentByte & (1 << (7-j)), то должно работать почти также быстро.

    P.s. и вообще у вас какой-то странный выбор порядка битов. Обычно сдвигают вправо, к младшему биту. Тогда вместо маски будет тупо 0x1.
    Ответ написан
  • How to properly check backend for updates in background?

    iLLuzor
    @iLLuzor
    Java, Kotlin, Android Developer
    Это делается через пуши.
    Ответ написан
  • Closure Vs Common Function pointer?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Если лямбда или анонимный класс не используют переменных из объемлющей области видимости, то компилятор не станет их захватывать и разницы со ссылкой на метод не будет. Чтобы убедиться в этом, проведём эксперимент. Нам понадобится три класса:
    import java.util.function.Supplier;
    
    public class ExampleWithMethodRef {
        private static String someMethod() {
            return "Internal value";
        }
    
        public static void main(String[] args) {
            String value = "External value";
            Supplier<String> lambda = ExampleWithMethodRef::someMethod;
        }
    }

    import java.util.function.Supplier;
    
    public class ExampleWithLambda {
        public static void main(String[] args) {
            String value = "External value";
            Supplier<String> lambda = () -> "Internal value";
        }
    }

    import java.util.function.Supplier;
    
    public class ExampleWithCapturingLambda {
        public static void main(String[] args) {
            String value = "External value";
            Supplier<String> lambda = () -> value;
        }
    }

    Скомпилируем все три и запустим с параметром -Djdk.internal.lambda.dumpProxyClasses=. В рабочем каталоге появятся классы, в которые разворачиваются лямбды и ссылки на методы. Посмотрим, что у них внутри:

    javap -p -c ExampleWithMethodRef$$Lambda$1
    final class ExampleWithMethodRef$$Lambda$1 implements java.util.function.Supplier {                       
      private ExampleWithMethodRef$$Lambda$1();                                                               
        Code:                                                                                                 
           0: aload_0                                                                                         
           1: invokespecial #10                 // Method java/lang/Object."<init>":()V                       
           4: return                                                                                          
                                                                                                              
      public java.lang.Object get();                                                                          
        Code:                                                                                                 
           0: invokestatic  #19                 // Method ExampleWithMethodRef.someMethod:()Ljava/lang/String;
           3: areturn                                                                                         
    }


    javap -p -c ExampleWithLambda$$Lambda$1
    final class ExampleWithLambda$$Lambda$1 implements java.util.function.Supplier {                          
      private ExampleWithLambda$$Lambda$1();                                                                  
        Code:                                                                                                 
           0: aload_0                                                                                         
           1: invokespecial #10                 // Method java/lang/Object."<init>":()V                       
           4: return                                                                                          
                                                                                                              
      public java.lang.Object get();                                                                          
        Code:                                                                                                 
           0: invokestatic  #19                 // Method ExampleWithLambda.lambda$main$0:()Ljava/lang/String;
           3: areturn                                                                                         
    }


    javap -p -c ExampleWithCapturingLambda$$Lambda$1
    final class ExampleWithCapturingLambda$$Lambda$1 implements java.util.function.Supplier {                                            
      private final java.lang.String arg$1;
                                                                                                                                         
      private ExampleWithCapturingLambda$$Lambda$1(java.lang.String);                                                                    
        Code:                                                                                                                            
           0: aload_0                                                                                                                    
           1: invokespecial #13                 // Method java/lang/Object."<init>":()V                                                  
           4: aload_0                                                                                                                    
           5: aload_1                                                                                                                    
           6: putfield      #15                 // Field arg$1:Ljava/lang/String;                                                        
           9: return                                                                                                                     
                                                                                                                                         
      private static java.util.function.Supplier get$Lambda(java.lang.String);                                                           
        Code:                                                                                                                            
           0: new           #2                  // class ExampleWithCapturingLambda$$Lambda$1                                            
           3: dup                                                                                                                        
           4: aload_0                                                                                                                    
           5: invokespecial #19                 // Method "<init>":(Ljava/lang/String;)V                                                 
           8: areturn                                                                                                                    
                                                                                                                                         
      public java.lang.Object get();                                                                                                     
        Code:                                                                                                                            
           0: aload_0                                                                                                                    
           1: getfield      #15                 // Field arg$1:Ljava/lang/String;                                                        
           4: invokestatic  #28                 // Method ExampleWithCapturingLambda.lambda$main$0:(Ljava/lang/String;)Ljava/lang/String;
           7: areturn                                                                                                                    
    }


    Невооружённым глазом видно, что байткод вариантов со ссылкой на метод и лямбдой, не использующей переменную, идентичен, в обоих случаях происходит обращение в пул констант. Но если лямбда обращается к переменной, то в прокси-классе появляется поле arg$1, содержащее значение захватываемой переменной. Формально это влияет на потребление памяти, но если вы не собираетесь генерировать лямбды миллионами, то это влияние которым можно пренебречь, тем более во времена, когда даже на мобильных устройствах объёмы памяти измеряются гигабайтами.
    Ответ написан
    1 комментарий
  • Почему параллельное I/O медленнее?

    Jump
    @Jump
    Системный администратор со стажем.
    Выяснил, что нежелательно иметь более 1-го потока для Дискового i/o
    Ну хотя бы потому что исполнительный механизм диска один - и в один момент времени будет выполнятся одна операция. А остальные будут ждать очереди.

    Если у нас один поток читает файл - будет очередь запросов этого потока. Фактически линейное чтение - такое диск отрабатывает на максимальной скорости. Обычный HDD показывает линейное чтение на уровне 100-200мегабайт в секунду.

    Если у нас десять потоков читает - у нас будет очередь запросов из разных потоков. Линейного чтения уже не будет, будет случайной чтение. А случайное чтение диски отрабатывают очень медленно. Обычный hdd покажет максимум 1мегабайт в секунду.
    Ответ написан
    5 комментариев
  • Сongestion avoidance (UDP)?

    @Drno
    чем меньше пакетов, тем быстрее они обработаются... особенно если это TCP
    Ответ написан
    5 комментариев
  • Производительность системы обмена сообщениями?

    402d
    @402d
    начинал с бейсика на УКНЦ в 1988
    В теории, там тяжелая операция , только снятия элемента с головы очереди. Опять же в теории она может
    оказаться выполняемой вместе с обновлением стекающего тока в микросхемах памяти.
    На практике нужно глубоко покопаться в всех этих виртулизациях . А так операция копирования данных
    в ОЗУ из одного места в другое , выполняется вспомогательными контролерами, а не АЛУ.
    Сорри, что в терминах ранних процессоров.
    Ответ написан
    3 комментария
  • Как ускорить выборку данных MongoDb?

    Посмотрите на explain запросов. Похоже что индексы созданы не оптимально.
    Ответ написан
    Комментировать
  • Для чего нужны пакетные менеджеры для js, например Yarn?

    1) При чем здесь NPM? На кой черт он сдался Node'у? И как он перекочевал во фронтенд? Это просто интересная фича Node, которую начали использовать фронтендеры, а bower развивался параллельно?

    Это пакетный менеджер, чтобы распространять пакеты централизованно, а не искать по всем закоулкам интернета. К этому пришли/придут все языки/среды разработки. У c# есть nuget, у php - composer...

    3) Зачем мне (буду говорить просто) на "сайте" какой-то файл package.json, lock.json? И вообще, зачем мне какие-то зависимости? Установка - да, удобно. Но ведь все условно плагины (галерейки, jquery и пр., и пр.) являются частью сайта и друг от друга не зависят обычно.

    все условно плагины

    Это хорошо, если написанный Вами код использует только зависимости первого уровня вложенности. В проектах бОльшего масштаба, вложенность зависимостей может достигнуть и 3 и 5 уровней. Это когда используемый Вами пакет зависит еще от трех пакетов, каждый из которых, в свою очередь, зависит еще от нескольких, каждый из которых может принести еще несколько зависимостей... Соберете руками?
    Максимум - плагин jquery зависит от самой jquery.

    Это в Вашем кейсе так. Но не значит, что у всех поголовно.

    Надо передать среду разработки - отдаю vagrantfile

    vagrant - сторонняя зависимость.

    Вы не смотрите, что Node.js - весь такой из себя сервер. Это в первую очередь тулчейн для разработки, а потом уже интерпретатор js. Ибо исторически, до появления node, сама только мысль о js на сервер-сайде вызывала эмоции вида "WTF? O_o Seriously?" и "LOL xD". Потому node.js релизился именно как готовый тулчейн для разработки поверх интерпретатора js. То, что над репозиторием npm появились другие менеджеры - это работа сообщества. Чем они лучше/хуже и в каких кейсах - думаю, практикующие люди вам ответят сегодня. Хотя, скорее всего отправят в поиск.
    Ответ написан
    Комментировать
  • Как организовать архитектуру взаимодействия микросервисов?

    Не нужно делать бложик на микросервисах, что для учебных целей, что для боевых.
    Всё что вы описали о бложике - комменты, юзеры, посты - это всё достаточно сильно связанные данные, и их нет смысла обрабатывать в разных сервисах. В том решении, что вы предложили всё будет отлично, если заменить "микросервис" на "контроллер" (который из MVC), будет классическое решение учебной задачи.

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

    Об аутентификации можно тоже говорить много и долго, обычно чтобы жить некоторое время без сервиса аутентификации её делают по токенам (JWT например). Тогда целевой сервис сам может проверить, авторизован человек или нет.

    Если уж так хочется бложик, то я бы оставил его в покое в виде самостоятельного сервиса, а в качестве других сервисов сделал бы:
    - уведомления о новых комментариях/постах в мессенджер/почту (как раз хорошо будет через MQ общаться с основным сервисом);
    - какую-нибудь аналитику элементарную, которая независимо собирается, например по посетителям, телеметрию короче;
    - сервис автопостов - заказываешь пост с нужным содержимым на указанную дату и время, этот сервис пользуется API основного сервиса бложика и постит что-либо без вашего участия.

    Вот уже что-то будет интересное. Обратите внимание, что пожалуй все из этих трёх сервисов могут работать без основного, и наоборот - основной сервис может класть сообщения в очередь для других сервисов (1-го и 2-го), и сервисы будут разгребать эту очередь пока работают.
    Ответ написан
    Комментировать
  • Many-to-many как избежать Race conditions?

    Вижу два решения - использовать очереди или выполнять проверку на уровне триггеров БД.
    Ответ написан
    Комментировать
  • Many-to-many как избежать Race conditions?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Блокировка таблицы или SQL-запрос, составленный так, чтобы возникала ошибка при попытке добавлении лишней записи.
    Например, для MySQL
    INSERT 
      INTO `users_subscriptions` (`user_id`, `subscription_id`)
      SELECT IF(`count` < 5, :userId, NULL), :subscriptionId
        FROM (
          SELECT COUNT(*) AS `count`
            FROM `users_subscriptions`
            WHERE `user_id` = :userId
        ) AS `t`
    Ответ написан
    Комментировать
  • Many-to-many как избежать Race conditions?

    @yayashitoya
    Как можно избежать этого ?


    Все уже придумано до нас. Лет эдак за 50.
    Делать в одной транзакции. И проверку и добавление подписки.
    Ответ написан
    Комментировать
  • Корректный вид URL для end point'a?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Если это RESTFUL, то
    Метод: PUT
    Путь: /events/:event_id
    Данные: title=Great+event&owner=Karl

    То, что у вас написано, больше похоже на фрагмент JSON-RPC.
    Ответ написан
    Комментировать
  • Корректный вид URL для end point'a?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    1ый. А еще лучше
    GET /events - список событий с фильтром
    GET /events/:id - данные одного выделенного события
    POST /events - создание нового
    PUT /events/:id - обновление события
    DELERE /events/:id - удаление события
    Ответ написан
    Комментировать