首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过持久化来减少脚本启动时间的方法?

通过持久化来减少脚本启动时间的方法?
EN

Stack Overflow用户
提问于 2022-09-27 17:57:54
回答 1查看 223关注 0票数 6

众所周知,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

代码语言:javascript
复制
#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的说法

代码语言:javascript
复制
                                      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::INETprogramming.htm配制而成

raku-persistent,重型服务器:

代码语言:javascript
复制
#! /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,轻型客户端:

代码语言:javascript
复制
#! /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

代码语言:javascript
复制
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 的单次调用也是如此

代码语言:javascript
复制
 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

一些要点:

  • 无论CPU和操作系统如何,Raku启动时间都是不受欢迎的。
  • 用于Perl &C的shell for i in $(seq...比自定义C run慢,但在Core2Duo上的Raku - 7m+ vs 10m+和i5上的3m+与4m+的性能上都要好于它。
  • OpenBSD不优先考虑速度
  • 第三方软件不对OpenBSD进行优先优化
EN

回答 1

Stack Overflow用户

发布于 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程序。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73871927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档