众所周知,Raku的启动时间是巨大的。
在我的机器上(旧的,但最现代化的):
time raku -e 'put "Hello, World!"'
495.67 - 567.02米利斯
(首次发射1.53秒)
time perl -E 'say "Hello, World!"'
13.63 - 19.51 millis
time sh -c 'echo "Hello, World!"'
4.31 - 6.88 millis
c
#include <stdio.h>
int main(void) {
puts("Hello, World!");
return 0;
}time ./hello
5.03 - 7.67 millis
time clang hello.c -o hello (编译)
126.39 - 195.66米利斯
Raku确实吹嘘了许多内置的优点--这使得它变得很重。
然而,有时您需要一个相当简单的脚本,并且您会更喜欢Raku的优雅,但是在启动时花费的等待会带来不满,并且您不会为您的下一个简单脚本选择Raku。
有什么办法帮它吗?
比如启动Raku一次并保持其运行,并让它处理所有的Raku脚本,无论是否有模块,大模块和小模块,以及raku -e ...?
类似于FastCGI的东西,而不是本地的shell?
甚至牺牲永久的巨大记忆对我来说也比浪费时间等待更好。
在KiloBytes,根据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和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以下。0.008848472一定是某种错误--它少于perl启动时间,这是不可能的。
这仍然是概念的证明,因为参数不会进入目标脚本。
更新2:
作为对https://stackoverflow.com/a/73918912/14812514的反应
建议工作台套间在我的机器上不通过Makefile工作,甚至在基于Debian的antiX 21上也是如此,并且在我做了所有的测量后,可能的解决方案被发现了。此外,在OpenBSD run.c 不会上甚至编译。在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 c run 10m34.460 0.63446 2.224 0.535
Core 2 Duo T5800 2 2 antiX shell seq 7m48.153 0.468153 3.878 1.509
^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一些要点:
for i in $(seq...比自定义C run慢,但在Core2Duo上的Raku - 7m+ vs 10m+和i5上的3m+与4m+的性能上都要好于它。发布于 2022-10-01 14:02:48
您描述的客户机-服务器模型对我来说似乎是个好主意!事实上,我自己也在尝试一个类似的想法;我在2022年的Perl会议( 给Raku的钉枪 )上就这个问题做了一次闪电式的演讲。
正如那篇文章所提到的,这是钉枪背后的基本思想--它实现了相同的想法,但对于Java来说却是如此。正如您注意到的,它比概念的证明要复杂一些,但是看起来确实是一个可行的Raku项目。
在另一个方面,我同意Raiph编辑:与Liz,哎呀!就发射速度而言,你发布的时间非常接近最坏的情况。我对语言启动时间基准的参考是bdrung/启动时间,它既有基准框架,也有作者自己的数据。为了便于比较,作者给出了“你好,世界!”C程序在0.26毫秒(2018年笔记本电脑)和2.19毫秒之间(对于覆盆子Pi 3)。这些时间可能为“你好,世界!”所测量的5.03到7.67ms的时间提供了一些上下文。C程序。
https://stackoverflow.com/questions/73871927
复制相似问题