Блог пользователя madkite

Автор madkite, 12 лет назад, По-русски

Тут стал вопрос производительности операций чтения/записи. Напомню, что в С++ есть замечательная функция-флаг ios_base::sync_with_stdio() с помощью которой можно отключить синхронизацию стандартных потоков C и С++, и тем самым повысить производительность. Замечательный компилятор от не менее замечательной фирмы Microsoft этот флаг тупо игнорирует. Т.к. я не директор Microsoft и даже не ответственный за выпуск Visual Studio — мне глубоко всё равно кто в этом виноват. Для меня главное — результат.

Простой тест показал:

1255626 — G++ с выключенным sync_with_stdio — 50 мс

1255624 — G++ c включенным sync_with_stdio — 200 мс

1255627 — MS C++ с проигнорированным sync_with_stdio — 230 мс

Но, т.к. на этом сайте GNU C++ используется через одно место, т.е. через Microsoft Windows, используя непонятный порт под названием MinGW, то мне стало интересно какова реальная ситуация. Я взял две одинаковые виртуальные машины, запущенные на одной и той же физической — одну с 32-хбитной Windows, другую с 32-хбитным Linux. Сгенерировал файл с 10 млн. рандомных чисел (около 100МБ, генерировал, между прочим, кодом из этого поста). Взял простой код, считывающий эти 10 млн. чисел. И вот скриншоты того, что получилось:

Windows/MSVS с проигнорированным sync_with_stdio ~15 с

Windows/MinGW c включенным sync_with_stdio ~14 с

Windows/MinGW c выключенным sync_with_stdio ~3 с

Linux/GCC c включенным sync_with_stdio ~8 с

Linux/GCC c выключенным sync_with_stdio <3 с

Т.о. в некоторых случаях можно добиться несколько кратного увеличения производительности простой сменой ОС и компилятора. Можете попробовать сами ;)

Полный текст и комментарии »

  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

Автор madkite, 12 лет назад, По-русски

Как известно, codeforces требует решения в виде одного файла. Это вызывает некоторые трудности использования своих классов-утилит. Также для java требуется, чтобы класс решения был в default package (а многие другие сайты требуют ещё, чтоб класс назывался Main и никак по-другому).

CHelper Egor'а — замечательный плагин, облегчающий жизнь java-программистов на этом и других сайтах. Только вот не все любят придерживаться определённого стиля написания контестов, тестирования, хранения архива и пр., особенно если этот стиль был определён не ими. Другие не любят сложный GUI. Третьи вообще предпочитают UNIX-way, когда любая программа или плагин выполняет только одну небольшую задачу, но делает это очень хорошо.

Одним словом, CHelper показался мне слишком сложным, но вдохновлённый им я решил сделать очень маленький плагин, который делает всего одну простую вещь — генерирует Main.java, включая в него зависимости и удаляя некоторый неиспользуемый код. GUI в пагине нет — только одна кнопка на панели с правой стороны. Если нажать эту волшебную кнопку, то из активного в данный момент файла сгенерируется класс Main в default package текущего модуля. Зависимые классы, исходники которых присутствуют в текущем проекте (в котором может быть несколько модулей), будут рекурсивно включены, некоторые неиспользуемые вложенные классы, методы и поля будут аккуратно удалены. Точкой входа считается метод public static void main(String[] args). Очевидно, что для SRM'ов topcoder-а смысла этого плагина нет.

Плагин использует исключительно лексический анализатор самой IDEA (называемый PSI), и поэтому в целом не привязан к конкретным правилам оформления кода. Единственная проблема, которая может возникнуть — это конфликт имён классов, потому что при внедрении классов теряется информация об имени пакетов (он может возникнуть, если у вас два используемых класса с одним названием в разных пакетах или же вы используете класс из default package текущего модуля). Это не считается багом, это очевидные издержки архитектуры. Потому будьте аккуратны, если используете классы с одинаковыми short name, но разными fully qualified name. Также рекомендую просматривать результирующий Main.java перед отправкой.

Других функций, кроме как генерить Main.java в плагине нет и не будет. Я думаю, что генерацию по шаблону стартовых классов-решений с тестирующим кодом (и даже с выдиранием примеров из условия) лучше каждый сделает сам для себя. Для этого не нужен плагин к IDEA — достаточно простого запускаемого класса.

Плагин можно скачать отсюда: http://plugins.intellij.net/plugin/?idea&id=6870. Также можно установить через репозиторий непосредственно из самой IDEA. На скриншоте смотреть особо нечего, но если сильно хочется, можно глянуть пример здесь.

P.S. Тем, кто хочет богатого функционала и любит GUI, советую CHelper.

Полный текст и комментарии »

  • Проголосовать: нравится
  • +32
  • Проголосовать: не нравится