Чем объясняется большое время выполнения простых программ в c / perl / python? - PullRequest
1 голос
/ 05 апреля 2020

Я написал простую программу на C, Perl и Python, которая увеличивает значение переменной до 1 миллиарда. Я не ожидал, что между разными языками будет большая разница, но был очень удивлен, увидев огромную разницу. Программы просто считают до 1 миллиарда:

В c:

int main() {
  int c = 0;

  while (c < 1000000000) {
    c++;
  }
}

В Perl:

#! /usr/bin/env perl

use strict;
use warnings;

my $x = 0;

while ($x < 1000000000) {
  $x++;
}

И в Python:

#!/usr/bin/env python

i = 0
while i < 1000000000:
  i += 1

Время выполнения с использованием функции времени zsh / bash:

Для c: пользователь 0,78 с 0,01 с системой 98% ЦП 1,813 всего

Для perl: 29,86 с пользовательской системой 0,13 с 99% общего процессора 30,205 всего

А для Python: с 71,96 с пользовательской системой 0,3% 98% процессора 1: 13,16 всего

Мне трудно полагать, что c был в 15 раз быстрее perl и примерно в 35 раз быстрее Python. Это кажется сумасшедшим для такой простой программы? Почему большая разница?

1 Ответ

5 голосов
/ 05 апреля 2020

Поскольку perl переменные нетипизированы (и могут фактически изменять свой эффективный тип в ходе выполнения), каждая операция над ними (например, <и ++) должна проверять: является ли эта переменная связанной; это перегруженное значение; это целое число; или поплавок; или строка: и если да, то она имеет правильную интерпретацию цифр c; или это undef? Et c et c. Для бинарных операций, таких как <, эта логика c применяется к обоим аргументам, и типы аргументов могут различаться. Таким образом, perl должен обрабатывать целые числа, добавленные к числам с плавающей запятой и т. Д. c. </p>

. Кроме того, perl не ограничивает результат арифметических операций c ops значением int. Вместо этого он динамически обновляет тип переменной, например, со знаком int до unsigned int, чтобы удвоить, чтобы лучше сохранить значение и точность результата.

Это означает, что perl должен выполнить огромное количество работать, например, с простым сложением: по сравнению с C, где компилятор знает, что оба аргумента являются целыми числами со знаком, и не заботится о переполнении результата; и может отображать добавление к одной инструкции добавления процессора

...