Labo288

プログラミングのこと、GISのこと、パソコンのこと、趣味のこと

DellのゲーミングノートG15(5515)にUbuntu20.04をインストールしたはなし

TL;DR

  • 公式のインストールメディアを使って難なくインストールできる
  • しかし、GPUドライバのインストールとNVIDIA X Server Settingsで設定の変更をしないと、Chromiumの動作が非常に重たくなる
  • NVIDIA X Server SettingsではNVIDIA(Performance Mode)を選択しよう

ちなみにLubuntuはマルチディスプレイが正常に動作しなかったので早々に断念

Ubuntuのインストール

下記のとおり

diagnose-fix.com

インストールするだけで、マルチディスプレイ環境も整うので特に問題ない…と思いきや、Chromiumベースのアプリケーションの動作が非常に重たくなりました。--disable-gpuフラグで起動すると軽快になるので、GPUが悪さしているという予想がつきます。しかし毎回の起動時にこのオプションを与えるのは非常にめんどうですし、VSCodeやSlackなどもChromiumベース(Electron)です、このままでは使い物になりません。

GPUドライバのインストール

下記のとおり

qiita.com

たぶん下記のようになるので、-510をインストールしました

vendor   : NVIDIA Corporation
driver   : nvidia-driver-470 - distro non-free
driver   : nvidia-driver-470-server - distro non-free
driver   : nvidia-driver-510 - distro non-free recommended
driver   : xserver-xorg-video-nouveau - distro free builtin

しかしこれでも解決せず。

NVIDIA X Server Settings

GPUドライバを入れると、NVIDIA X Server Settingsというアプリケーションがインストールされます。起動して下記の設定を行います。

f:id:kiguchi999:20220313135931p:plain
NVIDIA(Performance Mode)を選択

この値、デフォルトはNVIDIA On-Demandになっています。これを変更したらChromiumベースのアプリケーションが正常に動作するようになりました。

Windows10でストア配布じゃないPythonのパスを通す

TL;DR

以下の2行を、デフォルトで定義されている~~Microsoft\WindowsAppsよりも上位に定義しておきましょう

C:\Users\<username>\AppData\Local\Programs\Python\Python39
C:\Users\<username>\AppData\Local\Programs\Python\Python39\Scripts

Windows10のPython

当然初期状態のWindowsにはPythonは入っていませんが、なぜかコマンドのパスが通っており、cmd.exepythonと打つと、Microsoftストアが開きダウンロードを促されます。公式のPythonをインストールしていても同じ挙動になります。めんどくさい仕様ですが文句を言ってても仕方ないので迂回します(ちゃんとパスを通します)。

別にストア経由でPython入れても良いんですが、普通に配布されているものをストア経由で持ってくる必要もないので、公式からインストールしたいですね。

原因と対処は本記事冒頭のとおりで、デフォルトで通されているパスにWindowsAppsなるものがあるんですが、ここでPythonコマンドを認識しているのでしょう(やめてほしいけど)。この定義自体消しても良いんですが、ほかに不都合あったらそれはそれで面倒なので、これよりも上位に公式からインストールしたPythonのパスを追加します。

f:id:kiguchi999:20210829172901p:plain
こんなかんじ

Python39Python本体のパスを通すため、Scriptsはpipのためです。

JavaScript(Node.js)とWASMの処理速度比較

はじめに

WASMとはWebAssemblyのこと。最近のブラウザで実行可能なバイナリデータです。 そもそもJavascript(Node.js)は軽量言語にしては速いです。なので通常の用途において、WebAssemblyに置き換えるケースというのはあまり多くないでしょうが、単純な計算を繰り返し実行する必要があり、かつその速度を改善したい場合には、有効な手段と言えるでしょう。

今回はJavaScript(Node.js)とWASMで同じ関数を実行し処理速度を比較してみます。 ブラウザでも使えますが、速度比較の環境を作るのがめんどくさかったのでNode.jsと比較します(たぶんNode.jsの方がブラウザより速いでしょうから、WASM>Node.jsならWASM>ブラウザでしょう)。

WASMのつくりかた

wasm-pack + Rustで作ります(targetはnodejs)

github.com

実行する関数

フィボナッチ関数の第x項を求める関数です。メモ化などしていない素朴な実装。 第30項までを単純なループで実行し、その所要時間を比較します。

// Rust
pub fn fibo(x: u32) -> u32 {
    if x < 3 {
        return 1;
    }
    fibo(x - 1) + fibo(x - 2)
}
//JavaScript
const fiboJs = (idx) => {
    if (idx < 3) return 1
    return fiboJs(idx - 1) + fiboJs(idx - 2)
}

結果

# WASM
finish wasm 8.863149046897888
finish wasm, including init 13.06051504611969
# JavaScript
finish js 18.82902693748474

結論

  • 単純な計算速度の比較だけならWASMが2倍以上速い
  • WASMの初期化で多少のオーバーヘッドが発生する(それでも今回の処理ではWASMの方が速い)

おわりに

  • 関数の実行回数が増えれば増えるほどWASMが有利(WASMの初期化のロスの影響が小さくなるので)