【问题标题】:Way to minimize scripts start-up time via persistence?通过持久性最小化脚本启动时间的方法?
【发布时间】: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: " -&gt; $filename { EVALFILE $filename }'
来自https://stackoverflow.com/a/73873471/14812514

https://docs.raku.org/type/IO::Socket::INEThttps://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 ./&lt;file&gt; &gt;/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... 比自定义 C run 慢,但在 Raku 中表现优于它 - Core 2 Duo 上 7m+ vs 10m+ 和 i5 上 3m+ vs 4m+
  • OpenBSD 不优先考虑速度
  • 第三方软件不优先优化 OpenBSD

【问题讨论】:

  • raku -v 说什么?
  • @ElizabethMattijsen 2022.06。在你问我rakubrew build moar-master,Rakudo 2022.07-41-g90709d533 MoarVM 2022.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


【解决方案1】:

假设您有最新版本的 Rakudo,我可以说您确实有一台非常慢的机器:

% time perl -E 'say "Hello, World!"'
Hello, World!
real    0.05s
user    0.00s
sys 0.03s

% time raku -e 'put "Hello, World!"'
Hello, World!
real    0.12s
user    0.12s
sys 0.02s

是我在 2 年 M1 MacMini 上看到的数字。在运行 Debian 的 10 岁以上的 MacMini 上,我看到:

$ time perl -E 'say "Hello, World!"'
Hello, World!

real    0m0.009s
user    0m0.004s
sys 0m0.005s

$ time raku -e 'put "Hello, World!"'
Hello, World!

real    0m0.241s
user    0m0.287s
sys 0m0.041s

现在回到您的问题:是的,您可以使用 FastCGI 之类的东西,但要使用本地 shell:

% raku -e 'while prompt "Enter filename: " -> $filename { EVALFILE $filename }

运行它,输入要执行的脚本的名称并回车,它就会运行。现在,这是原则:这只运行不带参数的脚本。您可以在此基础上允许参数等。

【讨论】:

  • OpenBSD 7.1 amd64、ThinkPad T530、2012 年制造年份、HDD(不是 SSD)、i5-3320M、16GB RAM - 你认为它应该比 500+ 毫秒性能更高吗?
  • 至少你给了我一个起点。泰。不过,是否有一些完善的、充实的解决方案?当然,人们之前就有“本地 FastCGI”的想法。早得多,比我聪明得多的人,更需要克服性能滞后......不是只有Raku......没有听说过?
  • 我一个都不知道。现在大多数 Raku 用户使用更快的 CPU 和 SSD,这使得我猜脚本更容易接受。
【解决方案2】:

您描述的客户端-服务器模型对我来说似乎是一个非常好的主意!事实上,我自己也一直在玩类似的想法。实际上,我在 2022 年 Perl 和 Raku 会议上就这个主题做了一次闪电演讲,A Nailgun for Raku

正如那次谈话中提到的,这是Nailgun 背后的基本理念——它实现了相同的理念,但针对的是 Java。正如您所注意到的,它比概念证明要复杂一些,但绝对看起来像是一个可行的 Raku 项目。

另一方面,我同意 Raiph [edit: with Liz, oops!] 的观点,即你发布的时间在启动速度方面非常接近最坏的情况。我对语言启动时间基准的首选参考是bdrung/startup-time,它既有基准框架,也有作者自己的数据。作为比较,该作者的时钟是“Hello,World!” C 程序在 0.26 毫秒(对于 2018 笔记本电脑)和 2.19 毫秒(对于 Raspberry Pi 3)之间。这些时间可能会为您为“Hello, World!”测量的 5.03 到 7.67 毫秒时间提供一些背景信息。 C 程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-13
    • 2023-02-05
    • 2016-06-13
    • 2013-10-28
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    相关资源
    最近更新 更多