2011-01-05 11 views
1

Ich habe diesen Code hier, um eine Zeichenfolge von X-Räumen zu erstellen.Eine Zeichenkette mit sich wiederholenden Zeichen erstellen und zwischenspeichern?

private static string GetWhiteSpaceString(int howManySpaces) 
{ 
    return new string(' ', howManySpaces); 
} 

Wie könnte ich diese Zeichenfolge irgendwie zwischenspeichern, so wird es nur erstellt, wenn die Anzahl der Leerzeichen zum Beispiel geändert? Gibt es einen besseren Weg als eine globale Variable zu behalten?

Thanks :)

+2

Wenn Sie es zwischenspeichern müssen, schlägt das vor, dass Sie s% tloads davon erstellen. Warum? –

+5

"Wir sollten kleine Wirkungsgrade vergessen, sagen etwa 97% der Zeit: vorzeitige Optimierung ist die Wurzel allen Übels" - Knuth –

+0

Beachten Sie, dass eine solche Methode * synchronisiert * wichtig ist, wenn die Daten statisch sind; Siehe mein Update für weitere Informationen –

Antwort

2

Ich glaube nicht, dass Sie ein String zwischenzuspeichern müssen. .Net geht es ziemlich gut.

Aber wenn Sie immer noch fortfahren möchten, warum nicht einen Typ Dictionary<int,string> erstellen, um generierte Zeichenketten zu speichern und hinein zu schauen, bevor Sie eine neue zurückgeben?

0

Sie eine statische (synchronisiert) Dictionary<int,string> schaffen könnte - oder, wenn Sie alle Längen sind Cachen bis Größe zu einem bekannten, nur ein string[] (schneller und einfacher, keine Notwendigkeit zu synchronisieren entweder).

Zum Beispiel:

static readonly Dictionary<int, string> cache 
     = new Dictionary<int, string>(); 
    public static string GetSpaces(int count) { 
     // deal with brain-dead cases first to avoid lock for short strings 
     switch (count) 
     { // note these are all interned etc 
      case 0: return ""; 
      case 1: return " "; 
      case 2: return " "; 
      case 3: return " "; 
      case 4: return " "; 
      case 5: return "  "; 
      case 6: return "  "; 
      case 7: return "  "; 
      case 8: return "  "; 
      case 9: return "   "; 
      case 10: return "   "; 
     } 
     if(count < 0) throw new ArgumentOutOfRangeException("count"); 
     lock (cache) { 
      string s; 
      if (!cache.TryGetValue(count, out s)) { 
       cache.Add(count, s = new string(' ', count)); 
      } 
      return s; 
     } 
    } 
1

Vielleicht so etwas wie dieses (nur im Browser codiert, könnte nicht funktionieren):

Dictionary<int, string> cache = new Dictionary<int, string>(); 
private static string GetWhiteSpaceString(int howManySpaces) 
{ 
    if(cache.Keys.Contains(howManySpaces)) 
    { 
     return cache[howManySpaces]; 
    } 
    else 
    { 
     var text = new string(' ', howManySpaces); 
     cache[howManySpaces] = text; 
     return text; 
    } 
} 

Dies könnte tun, was Sie wollen, aber ich würde über die Speichernutzung gesorgt werden. Ich denke, es hängt davon ab, wie viel howManySpaces variiert.

+0

Wenn Sie die Logik um 'TryGet' zu verwenden, können Sie die doppelte Suche vermeiden, wenn das Element vorhanden ist. –

1

Die Methode, die die Zeichenfolgen erstellt, ist wahrscheinlich nicht der beste Ort, um sie zu cachen (wenn es überhaupt einen guten Grund gibt, sie zu cachen). Der Code, der die Zeichenfolgen verwendet, hat wahrscheinlich mehr Informationen darüber, welche Zeichenfolgen wiederverwendet werden können.

Wenn Sie die Zeichenfolgen zwischenspeichern, werden sie langlebige Objekte sein. Das bedeutet, dass sie wahrscheinlich in den Speicher der nächsten Generation verschoben werden. Wenn Sie ein Objekt von einem Zwischenspeicher in einen anderen verschieben, wird es von einem Speicherbereich in einen anderen kopiert. Es ist also mindestens so viel Arbeit wie beim Erstellen einer neuen Zeichenfolge.

In den meisten Fällen ist es effizienter, nur neue Zeichenfolgen zu erstellen, anstatt sie zwischenzuspeichern. Der Garbage Collector ist speziell für die effiziente Handhabung von kurzlebigen Objekten konzipiert.

Verwandte Themen