簡體   English   中英

哪個更好的實現方法 - 創建多個對象或使用實用程序類

[英]Which is better Implementation approach - Create multiple objects or use a Utility class

我正在開發一個吞吐量非常高的 REST 服務,它需要處理大規模(每秒幾千個請求)。 在嘗試實現一項功能時,我創建了一個具有所需功能的類。 它看起來像這樣 -

public class Sample {
    private SampleObject sampleObject;
    private SampleOther params;

    public Sample(final SampleObject sampleObject) {
        this.sampleObject = sampleObject;
    }

    public void process(){
        ...
        this.params = someComputation();
        this.processHelper();
        ...
    }

    private void processHelper(){
        ...
    }
}

您可以假設還有其他一些功能。 現在必須為每個傳入的請求創建一個新的 Sample 實例,這意味着將創建很多對象。 我的同事建議最好將類實現為具有靜態方法的實用程序類,並且您可以傳入參數以避免創建如此多的對象。 基本上是這樣的 -

public class Sample {
    
    public static void process(SampleObject sampleObject){
        ...
        processHelper(someComputation());
        ...
    }

    private void processHelper(SomeOther params){
        ...
    }
}

雖然兩種方法都做同樣的工作,但我覺得第一個設計更好。 但就性能和更好的資源利用率(需要更少的 GC 等)而言,似乎第二種方法更好。 我想聽聽關於在這種情況下應該做什么的不同意見。

如果你把所有的靜態方法都放在一個類中,那么它就變成了過程編程模型,這意味着這樣做你就失去了面向對象編程模型的所有特性。 我們通常將方法標記為靜態,當它的實現非常標准並且不會被其子類更改時。 對於業務方法,OOP 方法是可取的。

最大的堆/GC 成本不是每個請求對象的單個,而是在函數之間攜帶狀態的多個較小的對象(例如第二個示例中的Someother params )。 同樣適用於字符串對象、盒裝數字對象等。

避免每個請求創建 1 個新對象只是減少 1 個堆/GC 對象,您的第一個示例似乎創建了 2 個這樣的外部對象(1 個Sample和 1 個SampleObject )。 除了由someComputation創建的內部SampleOther對象。

理想情況下,高速實現每個請求的分配為零,但是每個並行處理線程需要一個壽命更長的處理對象,每個這樣的對象都有空間用於請求參數和計算緩沖區。 然而,這種方法不太適合基於對象的運行時,如 Java 和 .NET,其中自然風格是將所有請求參數作為由網絡運行時分配的對象接收,優化潛力只是減少數量每個請求分配的更多對象。

暫無
暫無

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

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