« マイカリー食堂でごろごろ野菜ロースかつカレー(大辛)を、カレーハウススパイシーでチキンカツカレー(大辛)をいただく。 | トップページ | 国立科学博物館のクラウドファンディングへの返礼品としてとても立派な本(地球の宝を守れ 科博コレクション図鑑)をもらった! »

2024年4月16日 (火)

Excel VBAからOfficeスクリプトへ乗換るための数値計算(5) 二次元拡散方程式の差分法の計算を両者でやって速度を比較した。あれ?Officeスクリプトの方がExcel VBAより1.5倍くらい遅い…意外。Node.jsのTypeScriptは両者より圧倒的に速いのだが…

ChromeなどでのJavaScriptは高速なので、当然VBAよりOffceScripts(TypeScript)のほうがずっと速いんじゃないかと思ってやってみた。

例題はループを何回も回すものとして2次元拡散方程式の差分法での計算にしてみた。

NxNのメッシュで、Nを増やしてみてどのくらいの計算量か見る。

VBA

Diffusionvba

Offceスクリプト

Diffusionscript

計算結果はほぼ同じ。では計算時間は?

Diffusioncomparison_20240415165101

あれ?意外。1.5倍くらいOffceスクリプトのほうが遅い。

でもNode.jsのTypeScriptはどっちもぶっちぎって爆速。なんでこんなに違うんだろう。

Officeスクリプトのコードはこんな感じ。
function main(workbook: ExcelScript.Workbook) {
    
    let selectedSheet = workbook.getWorksheet("OfficeScripts");
    const n : number =128;
    const m : number = 10000;
    const d : number = 0.01;
    let f0 : number[][] = Array(n + 2);
    let f1 : number[][] = Array(n + 2);
    let startTime : number = 0;
    let stopTime : number = 0;

 

    for (let i =0; i <= n + 1; i++) {
        f0[i] = Array(n + 2).fill(0);
        f1[i] = Array(n + 2).fill(0);
    }
    f0[n/2][n/2] = 1.0;
    
    startTime = performance.now();
    for (let k = 0; k < m; k++) {
        for (let i = 1; i <= n; i++) {
            f0[0][i] = f0[1][i];
            f0[n+1][i] = f0[n][i];
            f0[i][0] = f0[i][1];
            f0[i][n+1] = f0[i][n]; 
        }
        for (let i = 1; i <= n; i++) {
            for (let j = 1; j <= n; j++) {
                f1[i][j] = f0[i][j] 
                + d*(f0[i+1][j]+f0[i-1][j]+f0[i][j+1]+f0[i][j-1] - 4.0*f0[i][j]);
            }
        }
        for (let i = 1; i <= n; i++) {
            for (let j = 1; j <= n; j++) {
                f0[i][j] = f1[i][j];
            }
        }
    }
    stopTime = performance.now();
    selectedSheet.getRangeByIndexes(22, n+2, n+2).setValues(f0);
    selectedSheet.getCell(0,0).setValue((stopTime-startTime)/1000);
}
Excel VBAはこう。
Option Explicit

Private Sub CommandButton1_Click()

    Dim f1() As Double, f0() As Double
    Dim i As Integer, j As Integer, k As Integer, m As Integer, n As Integer
    Dim d As Double
    Dim startTime As Double, stopTime As Double
   
    Worksheets("VBA").Activate

    Application.ScreenUpdating = False
   
    n = 128
    m = 10000
    d = 0.01
    ReDim f1(n + 1, n + 1), f0(n + 1, n + 1)
    For i = 0 To n + 1
        For j = 0 To n + 1
            f0(i, j) = 0
        Next j
    Next i
    f0(n / 2, n / 2) = 1#
   
    startTime = Timer
    For k = 0 To m
   
        For i = 1 To n
            f0(0, i) = f0(1, i)
            f0(n + 1, i) = f0(n, i)
            f0(i, 0) = f0(i, 1)
            f0(i, n + 1) = f0(i, n)
        Next i
   
        For i = 1 To n
            For j = 1 To n
                f1(i, j) = f0(i, j) + d * (f0(i + 1, j) + f0(i - 1, j) + f0(i, j + 1) + f0(i, j - 1) - 4# * f0(i, j))
            Next j
        Next i
       
        For i = 1 To n
            For j = 1 To n
                f0(i, j) = f1(i, j)
            Next j
        Next i
       
    Next k
    stopTime = Timer

    Range(Cells(3, 3), Cells(3 + n + 1, 3 + n + 1)) = f0
    Cells(1, 1) = stopTime - startTime
    Application.ScreenUpdating = True
End Sub

(過去のもの)

Excel VBAからOfficeスクリプト(TypeScript)へ乗換るための数値計算(4) LU分解(奥村先生のC言語による最新アルゴリズム事典のTypeScript移植版)で連立方程式を計算する。セルの範囲を指定して実行すると任意の大きさの連立方程式の解がセルに表示される。

 Excel VBAからOfficeスクリプト(TypeScript)へ乗換るための数値計算(3) セル範囲を2次元配列、1次元配列に入れるところでハマる…as number[][]で数値型に直したり、[].concat(...a)で2次元から1次元に直したり、a.map((x) => [x])で1次元から2次元に直すなどした。

Excel VBAからOfficeスクリプト(TypeScript)へ乗換るための数値計算(2) 4段4次のルンゲクッタ法でローレンツ方程式を計算してみる。

Excelの自動化がいつの間にかVBAじゃなくてデスクトップ版でもOfficeスクリプト(TypeScript)で出来るようになっていた。Python in Excelとか触っているうちに出遅れた…そこで先日作った複素数クラスを使ってセルに入力した値を複素数計算できるようにした。

« マイカリー食堂でごろごろ野菜ロースかつカレー(大辛)を、カレーハウススパイシーでチキンカツカレー(大辛)をいただく。 | トップページ | 国立科学博物館のクラウドファンディングへの返礼品としてとても立派な本(地球の宝を守れ 科博コレクション図鑑)をもらった! »

パソコン・インターネット」カテゴリの記事

学問・資格」カテゴリの記事

日記・コラム・つぶやき」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« マイカリー食堂でごろごろ野菜ロースかつカレー(大辛)を、カレーハウススパイシーでチキンカツカレー(大辛)をいただく。 | トップページ | 国立科学博物館のクラウドファンディングへの返礼品としてとても立派な本(地球の宝を守れ 科博コレクション図鑑)をもらった! »

最近の記事

最近のコメント

2024年12月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
フォト
無料ブログはココログ