Как мы провели пару дней, работая над ускорением Perl

Это история о значительной оптимизации интерпретатора Perl, о борьбе со сложностями кода, и о том, как мы хотели «съесть торт так, чтобы он у нас остался» [английская поговорка «You can’t have your cake and eat it», означающая невозможность достижения двух противоположных целей].

На недавнем хакатоне Booking.com у нас появилась возможность поработать над ускорением функции размещения целых чисел в интерпретаторе Perl. В случае успеха это поможет ускорить практически все программы, которые работают в нашем проекте. Оказалось, что банальная реализация идеи могла бы сработать, но это привело бы к увеличению сложности поддержки кода. Наше исследование привело нас к тому, чтобы заставить препроцессор С улучшать качество кода, одновременно давая возможность ускорить выполнение программ.

Предыстория

В perlguts и PerlGuts Illustrated написано, что представление переменных в Perl обычно состоит из двух частей – заголовка и тела (представляемых как struct). Заголовок содержит необходимые для обработки переменных данные, которые не зависят от её типа, включая указатель на возможное тело.

image

Структура тела может сильно отличаться, в зависимости от типа переменной. Простейшая переменная — SvNULL, которая представляет undef и которой не требуется тело.

У строки (PV — “pointer value”) тело имеет тип XPV:

image

Структура тела PV отличается от тела PVNV. PVNV может содержать число с плавающей точкой и строковое представление того же значения.

image

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

Меняя типы

У Perl есть внутренняя функция для преобразования типов – это sv_upgrade (“scalar value upgrade”). Если у нас есть переменная,– допустим, целое число,- и нам надо обратиться к ней как к переменной другого типа (допустим, как к строке), sv_upgrade преобразовывает тип переменной (допустим, в тип, содержащий как целочисленное, так и строковое представление значения). Это может потребовать замены текущего тела большим по объёму.

Чтобы узнать, как реализована sv_upgrade, заглянем в функцию Perl_sv_upgrade в sv.c. Видно, что функция достаточно сложная, в коде много комментариев, описывающих разные особенности реализации. Это неудивительно — ведь она может принимать скалярное значение любого типа и преобразовывать его в вид, который может представлять любой другой тип.

В начале функции присутствует switch, работающий в зависимости от текущего типа переменной, который определяет, что необходимо сделать для нового типа. Вскоре после него есть второй switch, который разбирается с новым типом. В его втором блоке присутствует множество блоков if {}, делающих разные вещи в зависимости от старого типа. И в конце, после определения struct для нового тела и заполнения struct для заголовка правильными флагами, освобождается память, которую занимало старое тело.

Не заснули пока?

Наивный подход

Функция sv_upgrade вызывается из множества мест – не только из вывода целых чисел в виде строк, но и при присваивании целого числа переменной, которая до этого была обнулена.

Обнулённая переменная – это всегда undef, у которого нет тела. sv_upgrade в этом случае вызывается для корректной настройки тела новой переменной. Это правильное решение, которое сводит определённую работу с переменными в одном месте, и не множит сущности. Но это решение сказывается на производительности из-за выполнения некоего общего, и в данном случае, избыточного кода.

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

Первая, поскольку мы знаем, что это новый тип, будет простой:

SvFLAGS(sv) |= new_type; 

Вторая — сложнее:

SvANY(sv) = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv)); 

Описывается она в Illustrated perlguts так:

Начиная с версии 5.10, для чистого IV (без PV) слот IVX находится внутри HEAD, и не выделяется память для xpviv struct («body»). Макрос SvIVX использует арифметику указателя SvANY, чтобы указать на отрицательное смещение, которое подсчитывается во время компиляции, от HEAD-1 к sv_u.svu_iv, таким образом, чтобы PVIV и IV могли использовать тот же самый макрос SvIVX.

После 15 минут с карандашом и бумагой я убедился в том, что эта строка делает именно то, что описано в комментарии. После этого диаграмма из Illustrated Perl Guts стала более понятной:

image

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

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

Как съесть торт так, чтобы он у вас остался

Нам хотелось инкапсулировать этот сложный кусок кода, но без ухудшения быстродействия. Имея дело с С, мы обратились к препроцессору, чтобы запихнуть всё это в макрос – в других языках это выглядело бы, как сокрытие сложного кода за хорошо названной функцией или методом:

#define SET_SVANY_FOR_BODYLESS_IV(sv) \     SvANY(sv) = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv)) 

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

И как это изменило нашу ситуацию? При использовании макроса две вынесенные строки стали более простыми. В результате в патче нужно было только заменить вызов

sv_upgrade(dstr, SVt_IV); 

на эти две строчки:

SET_SVANY_FOR_BODYLESS_IV(dstr); SvFLAGS(dstr) |= SVt_IV; 

В результате, за счёт выноса сравнительно несложного кода мы должны получить прибавку к быстродействию. Но получим ли? Какой будет от этого реальный выигрыш?

Измерение выгоды

Наша бенчмарка достаточно конкретная, но при этом представляет собою довольно частый случай.

  $ dumbbench -i50 --pin-frequency -- \     ./perl -Ilib -e \     'for my $x (1..1000){my @a = (1..2000);}' 

А вот и результаты работы. До оптимизации:

  Rounded run time per iteration: 2.4311e-01 +/- 1.4e-04 

После оптимизации:

  Rounded run time per iteration: 1.99354e-01 +/- 5.5e-05 

Прирост в 18%. Успех.

Мы продемонстрировали нужность этой оптимизации, сложность которой стремится к нулю. В некоторых местах код Perl стал чуть более сложным, но внутренности функции sv_upgrade упростились. Действуя подобным образом, мы нашли ещё несколько мест, где можно было достичь оптимизации схожими методами. В результате мы сделали пять патчей в код Perl:

С выходом Perl 5.22, в том числе, благодаря этой работе, многие программы станут работать быстрее.

ссылка на оригинал статьи http://habrahabr.ru/post/263939/

PS4 уверенно лидирует на рынке приставок восьмого поколения. Sony показала отчёт за 2 квартал 2015 года

Прибыль Sony с апреля по июнь 2015 года составила 664 миллиона долларов, превысив в три раза прибыль за аналогичный период 2014 года. Компания уверенно лидирует на рынке игровых приставок восьмого поколения, показывает успешные продажи CMOS-матриц, но теряет деньги на собственных смартфонах и Sony Pictures.

image

С момента выхода Sony PlayStation 4 в 2013 году компания продала 25,3 миллиона приставок. Во втором квартале 2015 года компания отгрузила 3 миллиона. Объем продаж PlayStation 4 составил 2,3 миллиарда долларов, а чистая прибыль — 160 миллионов. За это же время Microsoft поставила 1,4 миллиона, а Nintendo — 0,47 миллиона приставок.

Подразделение Sony, которое делает сенсоры для камер для смартфонов Samsung и Apple, на 35% увеличило объем продаж — до 2 миллиардов долларов.

Негативные результаты показывает мобильное подразделение компании: продажи смартфонов упали на 16,3%. Компания выбрала стратегию продажи смартфонов высшей ценовой категории, но она на данный момент себя не оправдывает. Sony Pictures показала падение на 11,9% — убыток составил 96 миллионов долларов.

Ранее Nintendo зафиксировала значительный рост квартальной выручки впервые за последние 3 года. Операционная прибыль достигла $9,3 миллиона. В 2014 году компания зафиксировала убыток в $80,4 миллиона. За последние три месяца Nintendo продала 470 тысяч Wii U.

ссылка на оригинал статьи http://megamozg.ru/post/18110/

Facebook предлагает быстро проверить настройки безопасности своего аккаунта

В официальном блоге Facebook появилось сообщение о скором анонсе в социальной сети инструмента под названием Quick Checkup. Его функциональность заключается в быстрой проверке безопасности настроек аккаунта без необходимости переходить в настройки и кликать по многочисленным флажкам. Quick Checkup появится у пользователей Facebook в ближайшие несколько недель и будет выглядеть как информационное сообщение в самом верху ленты новостей; при желании от предложения социальной сети можно будет отказаться. Сейчас он доступен по прямой ссылке.

image
Фото Facebook
Использование Quick Checkup будет состоять из трёх последовательных шагов. В первом из них пользователю предложат проверить вход в Facebook на всех подключённых устройствах и при желании завершить забытую сессию:

image
Фото Facebook

Далее пользователь сможет выбрать как будет вести себя социальная сеть, если кто-то попробует войти под его аккаунтом в необычных условиях: с неизвестного ранее устройства, нового местоположения или нового браузера. Facebook предлагает в таком случае отправить или уведомление прямо в интерфейсе, либо предупредить пользователя по электронной почте:

image
Фото Facebook

Наконец последним третьим шагом Quick Checkup будет напоминание о необходимости надёжного хранения пароля от своего аккаунта в Facebook, о том, что не стоит использовать его же на других сервисах в интернете и том, что пароль должен быть уникальным.

image
Фото Facebook

C очень похожей инициативой в феврале этого года выступила и Google. Поисковый гигант предлагал пройти проверку в инструменте Security Checkup с тем, чтобы убедиться в безопасности настроек учётной записи. Правда, в качестве награды за это пользователю добавлялось дополнительное место в Google Drive в размере 2 Гб.

Буквально час назад основатель Facebook Марк Цукерберг на своей странице в социальной сети объявил о том, что он и его жена Присцилла ожидают пополнения в семье: у них должна родиться девочка. Будущие счастливые родители в компании своей собаки по кличке Чудовище(Beast) с нетерпением ожидают этого момента:

image

ссылка на оригинал статьи http://geektimes.ru/post/259614/

Треть звёзд Млечного Пути покидают место своего рождения


Карта миграции звёзд

Астрономы из Университета Нью-Мексико совместно с другими учёными из проекта Sloan Digital Sky Survey (SDSS, Слоуновский цифровой небесный обзор), построили новую карту Млечного Пути, на которой показаны маршруты миграции звёзд. Опубликованная 29 июля в журнале «The Astrophysical Journal» работа раскрывает новую информацию о том, как рождаются звёзды и как они путешествуют в течение своей жизни.

Многие люди меняют своё место жительства и переезжают на новые места, иногда находящиеся довольно далеко от места рождения. Учёные обнаружили, что около 30% звёзд также значительно отдаляются от тех мест, где они появились на свет.

В рамках обзора SDSS работает и спектрограф APOGEE (Apache Point Observatory Galactic Evolution Experiment), с помощью которого учёные, используя инфракрасную спектроскопию высокого разрешения, наблюдают внутренние области галактики, скрытые космической пылью. С помощью APOGEE учёные исследуют около 100 тысяч красных гигантов — причём, не только их спектральные характеристики, но и, в том числе, миграционные «повадки», а через них — и историю всей галактики Млечный Путь.

Спектральный анализ в деталях рассказывает о строении звёзд. При этом предыдущие звёзды, синтезировав в своих недрах химические элементы, после смерти передают эти элементы для формирования новых звёзд — таким образом, по составу звёзд можно судить об их происхождении.

Поскольку в разных районах галактики процесс такого «химического обогащения» проходит разными темпами, то среднее количество более тяжёлых элементов в звёздах разнится для разных регионов. Точно определив состав звезды, астрономы могут с высокой степенью вероятности предположить, в каком районе она сформировалась.

Выбрав в качестве маркеров 15 тяжёлых элементов, учёные провели расчёты на основании полученных за шесть лет наблюдений данных о составах звёзд, и с удивлением обнаружили, что порядка 30% светил образовались достаточно далеко от тех мест, где они находились в момент их изучения.

Как выяснилось по результатам исследования, миграция звёзд происходит преимущественно по радиальным направлениям — либо к центру галактики, либо от него. Скорее всего, такое поведение объясняется неравномерностью галактического диска, в котором есть ярко выраженные рукава и пустые пространства. Миграция звёзд ранее уже наблюдалась, но только лишь у соседних с нашим Солнцем. Теперь можно судить о том, что этот процесс наблюдается по всей галактике.

ссылка на оригинал статьи http://geektimes.ru/post/259612/

Спрос на «умные» часы вырос почти в три раза за год, количество моделей выросло в шесть раз

«Ядекс» проанализировал переходы на страницы продавцов из «Яндекс.Маркета» и выяснил, что за последний год спрос на умные часы вырос в 2,7 раза. Интерес к «умным» часам в агрегаторе «Яндекса» сравним с интересом к электронным книгам.

image

«Умные» часы в среднем стоят 11,3 тысячи рублей. В апреле 2015 года средняя цена равнялась 8 тысячам рублей.

В «Яндекс.Маркете» товары в категории «умные» часы продают две тысячи магазинов — в 1,7 раза больше, чем в июне 2014 года. Количество моделей — около ста пятидесяти.

Самой популярной моделью стал фитнес-браслет Xiaomi Mi Band. На втором месте — новый гаджет от Apple: часы Watch Sport 42mm со спортивным браслетом. Из десятки популярных в категории гаджетов выбыли COOKOO Watch, Nike FuelBand SE, Pebble SmartWatch.

Ранее Федеральная таможенная служба по жалобе Ассоциации компаний интернет-торговли (АКИТ) начала проверку продажи Apple Watch через «Яндекс.Маркет». Заявители отмечали, что Apple не начала продажи «умных» часов, но они уже были в выдаче агрегатора, и их можно было купить через сервис. Официально продажа Apple Watch в России началась сегодня утром.

ссылка на оригинал статьи http://megamozg.ru/post/18108/