簡體   English   中英

Kotlin/Java processBuilder 效率 vs python 子進程

[英]Kotlin/Java processBuilder efficiency vs python subprocesses

我在使用 JVM 進程時遇到問題,我正在嘗試創建一個程序,該程序需要多次調用不同的語言程序並更改參數。

例如,假設我需要在 10 秒內通過我的主程序 (KotlinJvm) 調用 node.js 程序 1000 次。

現在,我正在使用 ProcessBuilder class 來創建一個新進程,這樣我就可以將信息返回到我的主進程,但它不夠快。 它甚至很慢:/

我研究了一下,發現了 python 子進程庫,試圖在那里實現相同的想法。 在 python 3.9 中,我的實現效果很好! 快速

1.所以我問,python子進程和Jvm進程有什么區別

2. 有沒有辦法像 python 這樣創建 Jvm 子進程

正如我所讀到的,通過從同一個 ProcessBuilder 調用 .start .start()也可以在 Jvm 中創建子進程,但它仍然很慢。

只是為了確保,如果只調用一次就不會出現問題。 問題是我需要在 10-20 秒內調用這個文件 1000 次

在此處添加一些代碼作為示例

Kotlin 示例 - 我測試了一下, waitFor() function 需要很長時間,這是我的問題

Kotlin 進程代碼

Python 示例

Python子進程代碼

感謝幫助:)

編輯:如果這是相同的,有沒有辦法優化 Jvm 進程執行? 任何環境變化?

Python 打開 function 相當於 Java ProcessBuilder.start()方法。

在上面的示例中,您將 Jvm for subprocess to complete與 Python for subprocess to start的時間進行比較。

要比較相同的事物,您應該比較:

Jvm

// Start subprocess
val processHandle = ProcessBuilder("node", "someFile.js").start()
// Wait subprocess to terminate
val returnCode = processHandle.waitFor()

Python

# Start subprocess
val processHandle = subprocess.Popen(["node", "someFile.js")
# Wait subprocess to terminate
val returnCode = processHandle.wait()

編輯

我在我的筆記本電腦上進行了簡單的測試,我沒有看到 Kotlin 和 Python 之間的性能有顯着差異。 我會把它放在這里作為測試基礎,即使措施沒有“正確”完成(通過 JMH for Kotlin),它也給出了一個想法:

Kotlin

因此,對於 Kotlin,我制作了以下.kts 腳本:

import java.lang.ProcessBuilder;

fun main() {
    var started : Long = 0
    var completed : Long = 0

    for (i in 0 until 1000) {
        
        val start = System.nanoTime()

        val process = ProcessBuilder("ls").start()
        
        started += (System.nanoTime() - start)
        
        process.waitFor()

        completed += (System.nanoTime() - start)
    }

    println("Average time (ms) to start a process: ${started * 1e-9}")
    println("Average time (ms) to complete a started process: ${completed * 1e-9}")
}

在 jre 10 上加載 Kotlin REPL 1.4.21 后,我得到了以下 output:

Average time (ms) to start a process: 0.667509729
Average time (ms) to complete a started process: 5.042644314

Python

在 Python 3.7.9 上,以下腳本:

import subprocess
from time import perf_counter_ns 

started = 0
completed = 0

for i in range(0, 1000):

    start = perf_counter_ns()

    process = subprocess.Popen("ls")

    started += (perf_counter_ns() - start)
    
    process.wait()

    completed += (perf_counter_ns() - start)

print("Average time (ms) to start a process: ", started * 1e-9)
print("Average time (ms) to complete a process: ", completed * 1e-9)

輸出:

Average time (ms) to start a process:  1.620647841
Average time (ms) to complete a process:  6.208644367000001

所以,我目前的想法是,一旦執行上下文准備好,這兩種方法之間的性能應該不會有太大差距。 因此,如果您注意到很大的差異,那么問題可能是由於子流程之外的一些代碼或初始化引起的。

在這一點上,需要更多的細節(一個最小的可重復的例子是最好的)來找出正確的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM