簡體   English   中英

Java優化字符串與字符數組

[英]Java Optimization String vs Char Arrays

在我正在編寫的程序中,我正在進行大量的字符串操作。 我正在努力提高性能,我想知道使用char數組是否會顯示出不錯的性能提升。 有什么建議?

你在做什么樣的操縱? 你可以發一個代碼示例嗎?

您可能需要查看實現CharSequence的 StringBuilder以提高性能。 我不確定你想要自己動手。 StringBuilder不是線程安全btw ...如果你想要線程安全看看StringBuffer

String已經實現為char數組。 你有什么計划以不同的方式做什么? 無論如何,在那個和短暫對象的GC非常快的事實之間,如果你能找到一種通過替換char數組來提高性能的方法,我會感到驚訝。

Michael Borgwardt關於小字符數組和使用StringBuilder和StringBuffer的建議非常好。 但對我來說,主要的是盡量不要猜測什么是緩慢的:進行測量,使用剖析器,獲得一些明確的事實。 因為通常我們對性能的猜測結果是錯誤的。

以下是JDK 6.0 中String類完整源代碼的摘錄:

 public final class String implements  java.io.Serializable,
       Comparable<String>, CharSequence {
       /** The value is used for character storage. */
        private final char value[];

       /** The offset is the first index of the storage that is used. */
       private final int offset;

        /** The count is the number of characters in the String. */
       private final int count;

正如您在內部看到的那樣,該值已經存儲為一個字符數組。 作為數據結構的字符數組具有String類的所有限制,適用於大多數字符串操作:Java數組不會增長,即每次(確定,可能不是每一次)您的字符串都需要增長,您需要分配新數組並復制內容。

如前所述,使用StringBuilderStringBuffer進行大多數字符串操作是有意義的。

實際上以下代碼:

   String a = "a";
   a=a+"b";
   a=a+"c";

編譯后會自動轉換為使用StringBuilder,這可以在javap的幫助下輕松檢查。

根據經驗,很少有人花時間嘗試提高核心Java類的性能,除非你是這方面的世界級專家,因為這個代碼首先是由世界級專家編寫的。

你有沒有想過你的申請? 你知道瓶頸在哪里嗎? 如果性能低於標准,這是第一步。 好吧,那就是定義可接受的性能指標。

一旦你完成了一些任務的分析,你將花費百分比的時間做事。 如果你花了很多時間操縱字符串,也許你可以開始緩存一些操作? 當你只做一次就足夠時,你是否反復做一些(然后在需要時再次使用該結果)? 你不需要時復制字符串嗎? 請記住,java.lang.String是不可變的 - 因此無法直接更改。

我在優化/性能調整系統時發現了幾次我不知道慢慢來自本能的地方。 我已經看到其他人(而且,可恥的是,我自己)花了幾天時間來優化那些沒有收獲的東西 - 因為它不是最初的瓶頸,實際上花費的時間不到1%。

希望這有助於指明您正確的方向。

當你有很多短字符串時,使用char[]可以節省相當多的內存,這也意味着更少的緩存未命中速度。

但是對於大字符串,要注意的主要是避免不必要的復制,從而導致String的不變性。 如果你做了很多連接或替換,使用StringBuilder可以產生很大的不同。

暫無
暫無

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

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