Оптимизация агрегата для [закрытой] конкатенации строк

18
задан George Stocker 18 March 2014 в 14:54
поделиться

5 ответов

Вы 'переопределяете' Систему. Linq. Агрегат с Вашим собственным дополнительным методом в пространстве имен MakeAggregateGoFaster.

, Возможно, специализированный на IEnumerable<string> и использование StringBuilder?

, Возможно, взятие Expression<Func<string, string, string>> вместо Func<string, string, string>, таким образом, это может проанализировать дерево выражений и скомпилировать некоторый код, который использует StringBuilder вместо того, чтобы вызвать функцию непосредственно?

Просто предположение.

15
ответ дан 30 November 2019 в 05:48
поделиться

Почему бы не использовать одну из других форм Агрегата?

Enumerable.Range(0, size ).Aggregate(new StringBuilder(),
        (a, b) => a.Append(", " + b.ToString()),
        (a) => a.Remove(0,2).ToString());

можно указать любой тип для семени, выполнить любое форматирование, или заказные вызовы необходимы в первой лямбде, функционируют и затем настраивают выходной тип во второй функции лямбды. Созданные в функциях уже обеспечивают гибкость, в которой Вы нуждаетесь. Мои выполнения пошли от 1 444 мс до 6 мс.

44
ответ дан 30 November 2019 в 05:48
поделиться

Не ответ на вопрос, но я думаю, что стандартные шаблоны здесь должны использовать StringBuilder или строку. Соединение:

string.join(", ",Enumerable.Range(0, size).Select(n => n.ToString()).ToArray())
5
ответ дан 30 November 2019 в 05:48
поделиться

Ну, это зависело бы полностью от того, какой код находится в пространстве имен MageAggregateGoFaster, теперь не был бы он?

Это пространство имен не является частью времени выполнения.NET, таким образом, Вы связались в некотором пользовательском коде.

Лично я думал бы, что что-то, что распознает конкатенацию строк или подобный, и создает список, или подобный, затем выделяет один крупный StringBuilder, и использование Добавляет.

А грязное решение было бы:

namespace MakeAggregateGoFaster
{
    public static class Extensions
    {
        public static String Aggregate(this IEnumerable<String> source, Func<String, String, String> fn)
        {
            StringBuilder sb = new StringBuilder();
            foreach (String s in source)
            {
                if (sb.Length > 0)
                    sb.Append(", ");
                sb.Append(s);
            }

            return sb.ToString();
        }
    }
}

грязный, потому что этот код, при выполнении, что Вы говорите Вас, испытывает с Вашей программой, не использует функцию-делегат вообще. Это, однако, снизит время выполнения приблизительно от 2 800 мс до 11 мс на моем компьютере и все еще приведет к тем же результатам.

Теперь, в следующий раз, возможно, необходимо ли задать реальный вопрос вместо всего взгляд, насколько умный я тип избиения груди?

3
ответ дан 30 November 2019 в 05:48
поделиться

Причина, которую я спросил, была ли это загадка, состояла в том, потому что загадке позволяют пожертвовать устойчивостью в различных степенях, пока это удовлетворяет букву установленной проблемы. Имея это в виду, здесь идет:

Решение 1 (выполнения немедленно, проблема не проверяет):

public static string Aggregate(this IEnumerable<string> l, Func<string, string, string> f) {
     return "";
}

Решение 2 (выполнения о с такой скоростью, как проблема требует, но игнорирует делегата полностью):

public static string Aggregate(this IEnumerable<string> l, Func<string, string, string> f) {
    StringBuilder sb = new StringBuilder();
    foreach (string item in l)
        sb.Append(", ").Append(item);
    return sb.Remove(0,2).ToString();
}
4
ответ дан 30 November 2019 в 05:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: