Как я улучшаю производительность использования кода DateTime. ToString?

Поскольку речь идет о REST, просто получить метод запроса от сервера недостаточно. Вам также необходимо получить параметры маршрута RESTful. Причина разделения параметров RESTful и параметров GET / POST / PUT заключается в том, что для идентификации у ресурса должен быть свой уникальный URL-адрес.

Вот один из способов реализации RESTful-маршрутов в PHP с использованием Slim:

https://github.com/codeguy/Slim

$app = new \Slim\Slim();
$app->get('/hello/:name', function ($name) {
  echo "Hello, $name";
});
$app->run();

И настройте сервер соответственно.

Вот еще один пример использования AltoRouter:

https://github.com/dannyvankooten/AltoRouter

$router = new AltoRouter();
$router->setBasePath('/AltoRouter'); // (optional) the subdir AltoRouter lives in

// mapping routes
$router->map('GET|POST','/', 'home#index', 'home');
$router->map('GET','/users', array('c' => 'UserController', 'a' => 'ListAction'));
$router->map('GET','/users/[i:id]', 'users#show', 'users_show');
$router->map('POST','/users/[i:id]/[delete|update:action]', 'usersController#doAction', 'users_do');

19
задан Michal Sznajder 24 July 2009 в 08:17
поделиться

3 ответа

К сожалению, .NET не имеет своего рода "форматировщика", который может анализировать шаблон и запоминать его.

Если вы всегда используете один и тот же формат, вы можете хотите вручную создать форматтер, чтобы делать именно это. Что-то вроде:

public static string FormatDateTime(DateTime dt)
{
    char[] chars = new char[21];
    Write2Chars(chars, 0, dt.Day);
    chars[2] = '.';
    Write2Chars(chars, 3, dt.Month);
    chars[5] = '.';
    Write2Chars(chars, 6, dt.Year % 100);
    chars[8] = ' ';
    Write2Chars(chars, 9, dt.Hour);
    chars[11] = ' ';
    Write2Chars(chars, 12, dt.Minute);
    chars[14] = ' ';
    Write2Chars(chars, 15, dt.Second);
    chars[17] = ' ';
    Write2Chars(chars, 18, dt.Millisecond / 10);
    chars[20] = Digit(dt.Millisecond % 10);

    return new string(chars);
}

private static void Write2Chars(char[] chars, int offset, int value)
{
    chars[offset] = Digit(value / 10);
    chars[offset+1] = Digit(value % 10);
}

private static char Digit(int value)
{
    return (char) (value + '0');
}

Это довольно некрасиво, но, вероятно, намного эффективнее ... протестируйте это, конечно!

16
ответ дан 30 November 2019 в 04:25
поделиться

Вы уверены, что это занимает 33% времени? Как вы это измерили? Для меня это звучит более чем немного подозрительно ...

Это делает работу немного немного быстрее:

Basic: 2342ms
Custom: 1319ms

Или, если мы отключим ввод-вывод ( Stream.Null ) :

Basic: 2275ms
Custom: 839ms

using System.Diagnostics;
using System;
using System.IO;
static class Program
{
    static void Main()
    {
        DateTime when = DateTime.Now;
        const int LOOP = 1000000;

        Stopwatch basic = Stopwatch.StartNew();
        using (TextWriter tw = new StreamWriter("basic.txt"))
        {
            for (int i = 0; i < LOOP; i++)
            {
                tw.Write(when.ToString("dd.MM.yy HH:mm:ss:fff"));
            }
        }
        basic.Stop();
        Console.WriteLine("Basic: " + basic.ElapsedMilliseconds + "ms");

        char[] buffer = new char[100];
        Stopwatch custom = Stopwatch.StartNew();
        using (TextWriter tw = new StreamWriter("custom.txt"))
        {
            for (int i = 0; i < LOOP; i++)
            {
                WriteDateTime(tw, when, buffer);
            }
        }
        custom.Stop();
        Console.WriteLine("Custom: " + custom.ElapsedMilliseconds + "ms");
    }
    static void WriteDateTime(TextWriter output, DateTime when, char[] buffer)
    {
        buffer[2] = buffer[5] = '.';
        buffer[8] = ' ';
        buffer[11] = buffer[14] = buffer[17] = ':';
        Write2(buffer, when.Day, 0);
        Write2(buffer, when.Month, 3);
        Write2(buffer, when.Year % 100, 6);
        Write2(buffer, when.Hour, 9);
        Write2(buffer, when.Minute, 12);
        Write2(buffer, when.Second, 15);
        Write3(buffer, when.Millisecond, 18);
        output.Write(buffer, 0, 21);
    }
    static void Write2(char[] buffer, int value, int offset)
    {
        buffer[offset++] = (char)('0' + (value / 10));
        buffer[offset] = (char)('0' + (value % 10));
    }
    static void Write3(char[] buffer, int value, int offset)
    {
        buffer[offset++] = (char)('0' + (value / 100));
        buffer[offset++] = (char)('0' + ((value / 10) % 10));
        buffer[offset] = (char)('0' + (value % 10));
    }
}
9
ответ дан 30 November 2019 в 04:25
поделиться

Вы знаете, насколько большой будет каждая запись в двоичном и текстовом журналах? В таком случае вы можете разделить обработку файла журнала на несколько потоков, что позволит лучше использовать многоядерный / процессорный ПК. Если вы не возражаете против того, чтобы результат находился в отдельных файлах, было бы неплохо иметь по одному жесткому диску на каждое ядро, чтобы уменьшить количество перемещаемых головок дисков.

0
ответ дан 30 November 2019 в 04:25
поделиться
Другие вопросы по тегам:

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