Создание строки повторяющихся символов и ее кеширование? - PullRequest
1 голос
/ 05 января 2011

У меня есть этот код здесь, чтобы создать строку из пробелов X.

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

Как я могу как-то кэшировать эту строку, поэтому она создается только в том случае, если количество пробелов изменилось, например?Есть ли лучший способ, чем хранить некоторые глобальные переменные?

Спасибо :)

Ответы [ 4 ]

2 голосов
/ 05 января 2011

Не думаю, что вам нужно будет кэшировать String. .Net справляется с этим довольно хорошо.

Но если вы все еще хотите продолжить, почему бы не создать тип Dictionary<int,string> для хранения сгенерированных строк и просмотра их перед возвратом новой?

1 голос
/ 05 января 2011

Метод, который создает строки, вероятно, не лучшее место для их кэширования (если есть хотя бы веская причина для их кэширования). Код, использующий строки, вероятно, содержит больше информации о том, какие строки можно использовать повторно.

Если вы кешируете строки, они будут долгоживущими объектами. Это означает, что они, вероятно, будут перемещены в кучу памяти следующего поколения. Перемещение объекта из одной кучи в другую означает, что он будет скопирован из одного места в памяти в другое, так что это как минимум такая же работа, как создание новой строки.

В большинстве случаев эффективнее будет просто создавать новые строки, а не кэшировать их. Сборщик мусора специально создан для эффективной работы с недолговечными объектами.

1 голос
/ 05 января 2011

Возможно, что-то вроде этого (только кодируется в браузере, может не работать):

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;
    }
}

Это может делать то, что вы хотите, но я буду беспокоиться об использовании памяти.Я думаю, это зависит от того, насколько howManySpaces меняется.

0 голосов
/ 05 января 2011

Вы можете создать статический (синхронизированный) Dictionary<int,string> - или, если вы кэшируете все длины до известного размера, просто string[] (быстрее и проще; синхронизировать тоже не нужно).

Например:

    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;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...