【发布时间】:2022-10-08 01:22:38
【问题描述】:
Raku 启动时间是出了名的巨大的.
在我的机器上(旧的但我拥有的最现代的机器):
time raku -e 'put "Hello, World!"'
495.67 - 567.02 毫
(第一次启动需要 1.53 秒)
time perl -E 'say "Hello, World!"'
13.63 - 19.51 毫
time sh -c 'echo "Hello, World!"'
4.31 - 6.88 毫
c:
#include <stdio.h>
int main(void) {
puts("Hello, World!");
return 0;
}
time ./hello
5.03 - 7.67 毫time clang hello.c -o hello(编译)
126.39 - 195.66 毫
Raku 确实拥有许多内置的漂亮东西,这使它变得沉重。
然而,有时您需要一个相当简单的脚本,并且您更喜欢 Raku 的优雅,但是等待的启动时间会带来不满意,并且您不会为下一个简单的脚本选择 Raku。
有没有办法帮助它?
就像启动 Raku 一次并保持运行,让它处理所有 Raku 脚本,无论有没有模块,无论大小,以及 raku -e ... 也是如此?FastCGI 之类的东西,但对于本地 shell?
甚至永久牺牲巨大的对我来说,内存量比浪费时间等待要好。
以千字节为单位,根据ps:
Virtual size Resident set size
raku -e 'loop {sleep 1}' 146704 107200
perl -e 'while (1) {sleep 1}' 1252 4036
sh -c 'while true; do sleep 1; done' 892 900
#include <unistd.h>
void main(void) { for(;;) {sleep(1);} } 172 780
更新:
详述raku -e 'while prompt "Enter filename: " -> $filename { EVALFILE $filename }'
来自https://stackoverflow.com/a/73873471/14812514
由https://docs.raku.org/type/IO::Socket::INET 和https://www.tutorialspoint.com/perl/perl_socket_programming.htm 炮制而成
raku-persistent,重型服务器:
#! /usr/bin/env raku
use MONKEY-SEE-NO-EVAL;
my $listen = IO::Socket::INET.new( :listen,
:localhost<localhost>,
:localport(3333) );
loop {
my $conn = $listen.accept;
try {
while my $buf = $conn.recv() {
put now - (EVAL $buf)[1] - 37; # also subtract leap seconds
EVALFILE (EVAL $buf)[0];
}
}
$conn.close;
CATCH { default {.payload.say} }
}
ra,轻客户端:
#! /usr/bin/env perl
use strict;
use warnings;
use Time::HiRes;
use Socket;
my $file = shift || '/tmp/test.raku';
my $arg1 = shift || Time::HiRes::time;
# initialize host and port
my $host = shift || 'localhost';
my $port = shift || 3333;
my $server = "localhost"; # Host IP running the server
# create the socket, connect to the port
socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2])
or die "Can't create a socket $!\n";
connect(SOCKET, pack_sockaddr_in($port, inet_aton($server)))
or die "Can't connect to port $port! \n";
printf SOCKET '["%s", %f]', $file, $arg1;
close SOCKET or die "close: $!";
/tmp/test.raku:
put "Hello, World!";
run 'notify-send', 'Hello, World!'
raku-persistent在一个终端,一次;ra [script.raku] 在另一个终端,你想要多少次。
延迟范围 0.008848472 - 1.322056732;在大多数情况下低于 0.07。
这仍然是一个概念证明,因为参数不会进入目标脚本。
更新 2:
作为对https://stackoverflow.com/a/73918912/14812514 的回应
建议的工作台 suite 在我的机器上无法通过 Makefile 工作,即使在基于 Debian 的 antiX 21 上也是如此,并且在我半手动完成所有测量后找到了可能的 solution。此外,在 OpenBSD 上 run.c doesn't 甚至可以编译。在 c 为零时,我求助于 shell time for i in $(seq 1000); do ./<file> >/dev/null; done。
所有 4 台机器都有 HDD,没有 SSD。
我的初始配置是 i5-3320M OpenBSD 并标有^。
结果是秒为了1K 调用, 也为仅对 Raku 的单次调用:
CPU cores GHz OS via Raku K Raku 1 Perl K C K
Pentium 4-M i686 1 2.2 OpenBSD i386 shell seq 36m32.479 2.192479 22.368 6.408
Core 2 Duo T5800 2 2 antiX shell seq 7m48.153 0.468153 3.878 1.509
Core 2 Duo T5800 2 2 antiX c run 10m34.460 0.63446 2.224 0.535
^i5-3320M 2 2.6 OpenBSD shell seq 8m 0.011 0.480011 8.150 2.258
i5-3320M 2 2.6 antiX live c run 4m53.469 0.293469 1.157 0.276
i5-3320M 2 2.6 antiX live shell seq 3m37.042 0.217042 1.688 0.615
i7-3770S 4 3.1 OpenBSD shell seq 6m44.920 0.40492 7.026 2.340
i7-3770S 4 3.1 antiX live c run 4m 5.571 0.245571 0.872 0.268
一些亮点:
- 无论 CPU 和操作系统如何,Raku 启动时间都不受欢迎
- 对于 Perl 和 C,shell
for i in $(seq...比自定义 Crun慢,但在 Raku 中表现优于它 - Core 2 Duo 上 7m+ vs 10m+ 和 i5 上 3m+ vs 4m+ - OpenBSD 不优先考虑速度
- 第三方软件不优先优化 OpenBSD
【问题讨论】:
-
raku -v说什么? -
@ElizabethMattijsen
2022.06。在你问我rakubrew build moar-master,Rakudo2022.07-41-g90709d533MoarVM2022.07-9-g740f3bcbe- 500+ 毫秒的相同时间。来自 repo 的旧2021.12给出 646.90 - 716.58 毫秒 -
好的,所以它并不因为较旧的 Rakudo 而变慢。我猜硬盘驱动器也可能会减慢启动速度(这肯定会解释第一次调用的时间)
-
顺便说一句,看起来像是正在制作中的生态系统的一个不错的模块。
-
对于
~$ time raku -e 'put "Hello, World!"',我第一次调用:Hello, World!real 0m0.260suser 0m0.180ssys 0m0.067s。这是在一台使用了七年的机器上(Rakudo v2021.06)。
标签: performance time startup fastcgi raku