Как проверить "l oop" против "в то время как" l oop использование памяти без G C в Ruby - PullRequest
0 голосов
/ 07 января 2020

У меня есть код, протестированный в Ruby версиях 2.4 и 2.7:

1.

    GC.disable

    while true
        ?a
    end

2.

    GC.disable
    puts ?a while true

3.

    GC.disable

    loop do
        ?a
    end

4.

    GC.disable

    loop do
        puts ?a
    end

В примерах с 1 по 4 следует использовать всю доступную память и подкачку, поскольку все они создают строку a в бесконечном l oop, такую ​​что:

  • G C отключен.
  • Строка a не заморожена.

Но # 1 не потребляет больше байта во время выполнения. № 2, № 3 и № 4 используют как можно больше памяти. В моей системе они потребляют около 250 МБ в секунду или около того. Как и ожидалось, использование ядра процессора составляет 100%.

Почему # 1 почти не потребляет какую-либо память, в то время как другие используют всю доступную системную память за очень короткое время?

1 Ответ

2 голосов
/ 08 января 2020

Стефан прав в своем комментарии, поскольку l oop не создает новую область видимости.

Обратите внимание также на эффект метода puts. Он присваивает новый объект в памяти каждый раз, когда вызывается для строки.

require "benchmark/memory"

Benchmark.memory do |x|
  x.report("Test1") { puts ?a }
  x.report("Test2") { ?a }
  x.report("Test3") { puts ?a; puts ?a; puts ?a; puts ?a; puts ?a; puts ?a; puts ?a; puts ?a; puts ?a; puts ?a }
  x.report("Test4") { ?a; ?a; ?a; ?a; ?a; ?a; ?a; ?a; ?a; ?a; }

  x.compare!
end

Вывод:

Calculating -------------------------------------
           Test1    40.000  memsize (     0.000  retained)
                     1.000  objects (     0.000  retained)
                     1.000  strings (     0.000  retained)
           Test2    40.000  memsize (     0.000  retained)
                     1.000  objects (     0.000  retained)
                     1.000  strings (     0.000  retained)
           Test3   400.000  memsize (     0.000  retained)
                    10.000  objects (     0.000  retained)
                     1.000  strings (     0.000  retained)
           Test4    40.000  memsize (     0.000  retained)
                     1.000  objects (     0.000  retained)
                     1.000  strings (     0.000  retained)

Comparison:
           Test1:         40 allocated
           Test2:         40 allocated - same
           Test3:        400 allocated - 10.00x more
           Test4:         40 allocated - same
...