LINUX.ORG.RU

Программа на Rust

 ,


0

2

Сам я с яэыком не знаком, но при выходе новой версии под el7, компиляю «hello word» (rustc hello.rs -C link-args=-s) и смотрю размер бинарника, почему то с каждой версией размер растет …

289016 фев 19  2021 hello.149
297232 мар 10  2021 hello.150
293136 июн 18  2021 hello.152
317712 ноя 12  2021 hello.156.1
317776 дек 13  2021 hello.157
305464 мар  5  2022 hello.159
313656 апр 20  2022 hello.160
317752 июн  2  2022 hello.161
317752 июл 20  2022 hello.162
317752 июл 29  2022 hello.162.1
317752 авг 26  2022 hello.163
321848 окт 11  2022 hello.164
334128 дек  1  2022 hello.165
330032 янв 13  2023 hello.166
334128 фев  6  2023 hello.167
334128 мар  7 13:48 hello.167.1
334128 мар 20 08:35 hello.168
330032 май  2 13:02 hello.169
342320 июл 17 13:08 hello.170
354728 июл 28 14:46 hello.171
354728 авг 18 08:57 hello.171.1

P.S. В Go в начале падал, сейчас тоже стал расти.

★★★★★

Ответ на: комментарий от dnb

Каким образом это вообще связано, ну малваредев этот? А так, говорить что размер бинаря не имеет никакого значения такое себе. Может например надо сотню утилит залить в ПЗУ некой железки типа роутера. Пересобрал такой, а оно бац и в 1.5x~2х раза больше стало и тупо не влезает.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)

Какая разница, сколько весит helloworld? Этим же буквально замеряется размер кода инициализации и размер соответствующих компонентов библиотеки.

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

И вот например, добавили в бинарь дополнительной инфы для вывода стэктрейсов, он стал больше. Это хорошо или плохо? И сишку по-твоему как компилировать надо? С -O3 или -Os?

В общем странная метрика.

Ivan_qrt ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Собирать сотню бинарей для роутера статической линковкой весьма сомнительное занятие. А соберёшь динамикой и хоть как-то ощутимой разницы в размере не будет при изменении версий.

Ivan_qrt ★★★★★
()

Тебе тут хороший вопрос задали. А почему собсна меряешь изменения размера в hello world? Там же пользовательского кода вообще почти нет. Ты по сути меряешь размер фрагмента стандартной библиотеки, который требуется для hello world. Ты бы лучше мерял на каком-то настоящем приложении.

Aswed ★★★★★
()
Ответ на: комментарий от Aswed

Взял что то минимальное. Мне не сильно важно СКОЛЬКО оно весит, мне было интересно увидеть как меняется

размер фрагмента стандартной библиотеки, который требуется для hello world.

mx__ ★★★★★
() автор топика
Ответ на: комментарий от Ivan_qrt

Какая разница, сколько весит helloworld? Этим же буквально замеряется размер кода инициализации и размер соответствующих компонентов библиотеки.

Я показал что эти 2 вещи каждый раз растут.

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

Поэтому я старался минимизировать КОД.

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

Как его отключить ? Флаг компиляции какой ?

P.S. В Go я могу отключить отладочную информацию но как собрать с динамикой … не понял.

mx__ ★★★★★
() автор топика

почему то с каждой версией размер растет …

Стандартная библиотека растёт. А она линкуется целиком.

За счёт +nightly, cargo может пересобирать её. Добавь panic=abort, strip, lto и прочее. И будет ещё меньше. Можно и std вырезать: https://dev.to/szymongib/single-syscall-hello-world-in-rust-part-2-4jj4

AlexVR ★★★★★
()
Ответ на: комментарий от snake266

Она там в принципе есть, но ABI нестабилен абсолютно(любое минорное обновление библиотек требует перекомпиляции). Так не только в расте, это свойство есть у всех современных новомодных языков. Нормальная динамическая линковка существует только в сишке и плюсах, ну и более старых языках по типу фортрана. Вроде как-то так.

Werenter ★★★
()
Ответ на: комментарий от Werenter

И ещё в Swift, потому что яббл запарился (что совершенно разумно — ябблам нужно телефоны продавать, а не смузи хлебать, при этом «buy more RAM» не прокатит, т. к. от размера рамы и кэшей напрямую зависит энергоэффективность). Так что все новомодные языки под одну гребёнку не стоит :-)

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

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от AlexVR

Стандартная библиотека растёт. А она линкуется целиком.

Ээээ, хм. Покосился на Go, C … хм.

Что то мне в голову не приходило что Rust туда целиком всю либу ухает …

mx__ ★★★★★
() автор топика
Ответ на: комментарий от dnb

Все, кого волнует размер бинарей, автоматически попадают в базу малваредевелоперов. Тебя пока карандашом пометили, но могут и ручкой.

$ find /usr/bin -type f | wc -l
2239 
$ du -sh /usr/bin
960M
$ find /usr/bin -size +10M | xargs du -sh | sort
13M	/usr/bin/eww
15M	/usr/bin/nvim
16M	/usr/bin/aerc
17M	/usr/bin/qemu-system-riscv32
17M	/usr/bin/qemu-system-riscv64
20M	/usr/bin/qemu-system-i386
20M	/usr/bin/qemu-system-x86_64
22M	/usr/bin/gopls
24M	/usr/bin/qemu-system-aarch64
24M	/usr/bin/syncthing
26M	/usr/bin/skopeo
27M	/usr/bin/podman-remote
28M	/usr/bin/trace
29M	/usr/bin/buildah
36M	/usr/bin/podman
43M	/usr/bin/gh
88M	/usr/bin/telegram-desktop
92M	/usr/bin/packer
92M	/usr/bin/pandoc

И вот таким нехитрым образом мы видим что 2/3 /usr/bin занимают статически слинкованные ушлепки. Не надо так :)

cumvillain
()
Ответ на: комментарий от Werenter

Да, я знаю, поэтому у меня он поставлен статикой из aur. Тем не менее, это не отменяет проблемы с тем же gh или packer или syncthing, где по сути 90% программы это stdlib и один-два сторонних http стека.

cumvillain
()
Ответ на: комментарий от Werenter

В итоге им приходится на каждое мелкое обновление хаскелевых либ пересобирать мир…

Собственно, это меня дико бесит в Rust, где никак не могут признаться себе что системному языку все-таки нужна динамическая линковка чтобы не порождать hello world по 400k.

cumvillain
()
Ответ на: комментарий от mx__

Динамика есть у всех в том или ином виде. Проблема в том, что как заметил @Werenter пересборка мира на каждый чих из-за отсутствия стабильного ABI. Ну и тот факт что pandoc в статике 92M, а в динамике 572M. Потому что хачкель активно инлайнит и выкидывает мертвый код.

cumvillain
()
Ответ на: комментарий от Werenter

Она там в принципе есть, но ABI нестабилен абсолютно(любое минорное обновление библиотек требует перекомпиляции)

Ситуацию усугубляет еще то, что раст апдейтится каждые несколько недель и отсутствие LTS версий.

snake266 ★★
()
Ответ на: комментарий от intelfx

что совершенно разумно — ябблам нужно телефоны продавать

Lol, так и вижу, как в рекламной компании нового айфона эппл большими буквами пишет: «У нас САМАЯ КРУТАЯ динамическая линковка, всем брать!» А смузихлёбы, которые эти айфоны покупают, такие: «Вау, это круто, да, в жопу новый экран и прочие навороты, динамическая линковка это киллер-фича! 😍»

Virtuos86 ★★★★★
()

у Столмана та-же проблема..

«helloword.c» вырос с 86K до 1M :-) http://ftp.gnu.org/gnu/hello/

без обвеса:

/* hello.c -- print a greeting message and exit.

   Copyright 1992-2019 Free Software Foundation, Inc.

   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */

#include <config.h>

#include <getopt.h>
#include <stdnoreturn.h>
#include <wchar.h>

#include "system.h"

#include "closeout.h"
#include "configmake.h"
#include "dirname.h"
#include "errno.h"
#include "error.h"
#include "gettext.h"
#include "progname.h"
#include "propername.h"
#include "version-etc.h"
#include "xalloc.h"

/* The official name of this program (e.g., no 'g' prefix).  */
#define PROGRAM_NAME "hello"

#define AUTHORS \
  proper_name ("Karl Berry"), \
  proper_name ("Sami Kerola"), \
  proper_name ("Jim Meyering"), \
  proper_name ("Reuben Thomas")

/* Print help info.  This long message is split into
   several pieces to help translators be able to align different
   blocks and identify the various pieces.  */
static _Noreturn void
print_help (FILE *restrict out)
{
  const char *lc_messages = setlocale (LC_MESSAGES, NULL);
  /* TRANSLATORS: --help output 1 (synopsis)
     no-wrap */
  fprintf (out, _("Usage: %s [OPTION]...\n"), program_name);
  /* TRANSLATORS: --help output 2 (brief description)
     no-wrap */
  fputs (_("Print a friendly, customizable greeting.\n"), out);
  fputs ("\n", out);
  /* TRANSLATORS: --help output 3: options
     no-wrap */
  fputs (_("  -t, --traditional       use traditional greeting\n"), out);
  fputs (_("  -g, --greeting=TEXT     use TEXT as the greeting message\n"), out);
  fputs ("\n", out);
  fputs (_("      --help     display this help and exit\n"), out);
  fputs (_("      --version  output version information and exit\n"), out);
  emit_bug_reporting_address();
  /* Don't output this redundant message for English locales.
     Note we still output for 'C' so that it gets included in the man page.  */
  if (lc_messages && STRNCMP_LIT (lc_messages, "en_"))
    {
      /* TRANSLATORS: Replace LANG_CODE in this URL with your language code
	 <https://translationproject.org/team/LANG_CODE.html> to form one of
	 the URLs at https://translationproject.org/team/.  Otherwise, replace
	 the entire URL with your translation team's email address.  */
      fprintf (out, _("Report %s translation bugs to "
		"<https://translationproject.org/team/>\n"), PACKAGE_NAME);
    }
  exit(out == stderr ? EXIT_FAILURE : EXIT_SUCCESS);
}

static void
parse_options (int argc, char *argv[], const char **greeting_msg)
{
  int optc;
  int lose = 0;
  enum {
    OPT_HELP = CHAR_MAX + 1,
    OPT_VERSION
  };
  static const struct option longopts[] = {
    {"greeting", required_argument, NULL, 'g'},
    {"traditional", no_argument, NULL, 't'},
    {"help", no_argument, NULL, OPT_HELP},
    {"version", no_argument, NULL, OPT_VERSION},
    {NULL, 0, NULL, 0}
  };

  while ((optc = getopt_long (argc, argv, "g:t", longopts, NULL)) != -1)
    switch (optc)
      {
	/* --help and --version exit immediately, per GNU coding standards.  */
      case OPT_VERSION:
	version_etc (stdout, PROGRAM_NAME, PACKAGE_NAME, PACKAGE_VERSION, AUTHORS, (char *) NULL);
	exit (EXIT_SUCCESS);
      case 'g':
	*greeting_msg = optarg;
	break;
      case OPT_HELP:
	print_help (stdout);
      case 't':
	*greeting_msg = _("hello, world");
	break;
      default:
	lose = 1;
	break;
      }

  if (lose || optind < argc)
    {
      /* Print error message and exit.  */
      if (argv[optind])
        error (0, 0, "%s: %s", _("extra operand"), argv[optind]);
      emit_try_help ();
      exit (EXIT_FAILURE);
    }
}

int
main (int argc, char *argv[])
{
  const char *greeting_msg;
  wchar_t *mb_greeting;
  mbstate_t mbstate = { 0, };
  size_t len;

  set_program_name (argv[0]);

  /* Set locale via LC_ALL.  */
  setlocale (LC_ALL, "");

#if ENABLE_NLS
  /* Set the text message domain.  */
  bindtextdomain (PACKAGE, LOCALEDIR);
  textdomain (PACKAGE);
#endif

  /* Having initialized gettext, get the default message. */
  greeting_msg = _("Hello, world!");

  /* Even exiting has subtleties.  On exit, if any writes failed, change
     the exit status.  The /dev/full device on GNU/Linux can be used for
     testing; for instance, hello >/dev/full should exit unsuccessfully.
     This is implemented in the Gnulib module "closeout".  */
  atexit (close_stdout);

  parse_options(argc, argv, &greeting_msg);

  len = strlen(greeting_msg) + 1;
  mb_greeting = xmalloc(len * sizeof(wchar_t));
  len = mbsrtowcs(mb_greeting, &greeting_msg, len, &mbstate);
  if (len == (size_t)-1)
    error (EXIT_FAILURE, errno, _("conversion to a multibyte string failed"));

  /* Print greeting message and exit. */
  wprintf (L"%ls\n", mb_greeting);
  free(mb_greeting);

  exit (EXIT_SUCCESS);
}
MKuznetsov ★★★★★
()
Последнее исправление: MKuznetsov (всего исправлений: 1)
Ответ на: комментарий от MKuznetsov

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

Я глянул ldd у этого кода (c десяток либ), и теперь вообще не понимаю, это вообще компилятор или что …

mx__ ★★★★★
() автор топика
Последнее исправление: mx__ (всего исправлений: 1)
29 сентября 2023 г.
354728 авг 18 08:57 hello.171.1
...
395688 сен 29 09:03 hello.172.1

Сегодня в el7 прилетел (с реп) очередной Rust. Что то размер бинарника не слабо так подрос…

mx__ ★★★★★
() автор топика

Ну очевидно же, что хелло ворлд не может весить ни 290 КБ, ни 355 КБ, это абсурд. Значит нет LTO, то бишь в бинарь суют тупо всю стандартную библиотеку. Вот и ответ на твой вопрос. Или ищи, как динамически линковать стандартную библиотеку, или ищи, как делать linker gc/LTO. Если никак, значит никак, так и будет расти. В библиотеку-то добавляют всякое.

vbr ★★★
()
Последнее исправление: vbr (всего исправлений: 2)
Ответ на: комментарий от vbr

так мне уже ранее объяснили, я просто кинул инфу как есть.

Видать много в последнем расте накинули…

Да еще меня прикалывает что достаточно оперативно он появляется в epel для el7, при всем том тот же новый Debian/Ubuntu все сидят на 1.62 …

mx__ ★★★★★
() автор топика