The Joy of DTrace

[草稿] 上次更新時間者: Joe Schaefer 上的 週三, 17 4月 2024    來源
 

測量兩次,切掉一次,再投入程式碼最佳化工作

沒有任何東西使測量產品比 DTrace 更容易。

影片來源.

      alias perlfreq="dtrace -qZn 'sub-entry { @[strjoin(strjoin(copyinstr(arg3),\"::\"),copyinstr(arg0))] = count() } END {trunc(@, 10)}'"
      alias perlperf="dtrace -qFZn 'sub-entry { start[strjoin(strjoin(copyinstr(arg3),\"::\"),copyinstr(arg0))] = timestamp } sub-return { @[strjoin(strjoin(copyinstr(arg3),\"::\"),copyinstr(arg0))] = quantize((timestamp - start[strjoin(strjoin(copyinstr(arg3),\"::\"),copyinstr(arg0))])/1000); } END {trunc(@, 10)}'"
      alias perlop="dtrace -qZn 'sub-entry { self->fqn = strjoin(copyinstr(arg3), strjoin(\"::\", copyinstr(arg0))) } op-entry /self->fqn != \"\"/ { @[self->fqn] = count() } END { trunc(@, 3) }'"

目標最佳化.

每個$dtlv 下面的類別方法呼叫會在編譯階段完成,由:密封


use Carp;
sub devar_var :Sealed {
        my Dotiac::DTL::Value $dtlv;
    my $name=shift;
        return $dtlv->safe(undef) unless defined $name;
    my $n=$name;
        my $param=shift;
    my $f=substr $name,0,1;
    my $l=substr $name,-1,1;
    my $escape=shift;
    #TODO
    confess $param unless ref $param;
    confess $escape unless defined $escape;
    #confess @_ unless @_;
    #TODO
        return $dtlv->safe(substr $name, 1, -1) if $f eq "'" and $l eq "'" or $f eq '"' and $l eq '"';
    return $dtlv->safe(descap(substr $name, 1, -1)) if $f eq "`" and $l eq "`";
    if ($name eq "block.super" and $param->{"block.super"}) {
        return $dtlv->safe($param->{"block.super"}->string($param,@_)) if Scalar::Util::blessed($param->{"block.super"});
        return $dtlv->safe($param->{"block.super"}->($param,@_)) if ref $param->{"block.super"} eq "CODE";
    }
    return $dtlv->new($param->{$name},!$escape) if exists $param->{$name};
    my @tree=split/\./,$name;
    $name=shift @tree;
    unless (exists $param->{$name}) {
        return $dtlv->safe($n) if $n!~/[^\d\-\.\,\e]/;
        if ($Dotiac::DTL::cycle{$name} and $Dotiac::DTL::cycle{$name}->[1]) {
            return $dtlv->safe("") if $Dotiac::DTL::included{"cycle_$name"}++;
            my $r=devar_raw($Dotiac::DTL::cycle{$name}->[2]->[$Dotiac::DTL::cycle{$name}->[0]-1 % $Dotiac::DTL::cycle{$name}->[1]],$param,$escape,@_);
            $Dotiac::DTL::included{"cycle_$name"}=0;
            return $r;
        }
        return $dtlv->safe(undef) ;
    }
    $param=$param->{$name};
    while (defined(my $name = shift @tree)) {
        my $r = reftype $param;
        if ($r) {
            if ($r eq "HASH") {
                if (not exists $param->{$name}) {
                    return $dtlv->safe(undef) unless blessed $param;
                }
                else {
                    $param=$param->{$name};
                    next;
                }
            }
            elsif ($r eq "ARRAY") {
                if ($name=~m/[^-\d]/) {
                    return $dtlv->safe(undef) unless blessed $param;
                }
                else {
                    if (not exists $param->[$name]) {
                        return $dtlv->safe(undef) unless blessed $param;
                    }
                    else {
                        $param=$param->[$name];
                        next;
                    }
                }
            }
        }
        if (blessed $param) {
            return $dtlv->safe(undef) unless $Dotiac::DTL::ALLOW_METHOD_CALLS;
            if ($param->can($name)) {
                $param=$param->$name();
                next;
            }
            elsif ($param->can("__getitem__")) {
                my $x;
                eval {
                    $x=$param->__getitem__($name);
                    1;
                } or return $dtlv->safe(undef);
                if (defined $x) {
                    $param=$x;
                    next;
                }
            }
            return $dtlv->safe(undef);
        }
        return $dtlv->safe($n) if $n!~/[^\d\-\.\,\e]/;
        return $dtlv->safe(undef);
    }
    return $dtlv->new($param,!$escape);
}
永久鏈結  #bpftrace   #dtrace   #modperl   #solaris   #追蹤   #追蹤  

 


註解  


附件 

連結 


索引

NonFunctional 測試



 

  • Git 和非否認 — 「 提交」歷史與「 上傳」歷史之間有明顯的區別 … 週六, 27 4月 2024

 

  • 郵件群組 — 這些暫時地址是必要的ezmlm-idx 語言的訂閱和協調管制系統 … 週六, 27 4月 2024

 

  • 資訊安全入門 — 所有源自程式實際執行 UNIX ** 系統呼叫 ** 的資料都應視為 ** 保留 ** … 週六, 27 4月 2024

龍年


 


 

  • 應用程式效能 — 許多開發人員陷入思考效能最佳化的困境,在於讓每一行程式碼儘可能有效率 … 週二, 23 4月 2024


2020 年 3 月 COVID-19

  • 指數成長和 COVID-19 — 使用 the math 區段花時間— 成為與當前疫情相關的受教育統計消費者是很重要的 … 週一, 30 1月 2023

 

  • 垃圾信問題 … — 單一最佳外掛程式qpsmtpd,雖然很難理解原因 … 週日, 29 1月 2023

雙曲蜂巢


刺青和羽毛


英文語言相依性


 

  • DevOps 移動 — 「移動」背後的大想法不只是為開發人員提供更多繩索 … 週五, 15 12月 2023

 

  • 玩 htop — 熱門 Unix 平台的進階 htop 功能 … 週四, 19 1月 2023

資訊架構

  • 資訊架構 — 與設計、簡報、關係和架構限制相關的整個技術,涵蓋您服務的每個 URL … 週一, 11 3月 2024