C # foreach низкая производительность - PullRequest
0 голосов
/ 02 ноября 2018

Я разрабатываю программу, которая печатает на термопринтере (вы знаете, POS-принтеры и т. Д.) Идея состоит в том, чтобы позволить моим веб-приложениям печатать на этих принтерах напрямую (например, на Zebra). Проблема в том, что для больших документов печать занимает +/- 40 секунд. Я сделал небольшую отладку, и заказ вводится непосредственно в работу, однако это медленный foreach (строка).

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

try
{
    var printc = new PrintC();
    var y = 0;

    List<int> col = null;
    int tcol = 0;

    Font f;
    SizeF TestSize;
    Conversor convert = new Conversor();

    PrintDocument p = new PrintDocument();
    p.PrinterSettings.PrinterName = "RESGEST";
    p.PrintPage += delegate (object sender1, PrintPageEventArgs e1)
    {
        Graphics g = e1.Graphics;

        f = new Font("Arial", 10, FontStyle.Regular);

        dynamic obj = objeto.GetValue("el");
        foreach (dynamic item in obj)
        {
            switch ((string)item.type)
            {
                case "font":
                   // Console.WriteLine("Font: size-" + item.GetValue("size"));
                    f = new Font("Arial", (int)item.size, FontStyle.Regular);
                    break;
                case "text":
                    TestSize = g.MeasureString((string)item.texto, f);
                    TestSize = g.MeasureString((string)item.texto, f, convert.w(TestSize, (string)item.w, p, tcol));

                    int tmpy;

                    e1.Graphics.DrawString(
                        (string)item.texto, //texto
                        f, //font
                        new SolidBrush(convert.cor((string)item.cor)), //font color
                        printc.container(p, 
                        e1, 
                        convert.x((string)item.x, TestSize, p, col, tcol), //pos x
                        y, //pos y
                        convert.w(TestSize, (string)item.w, p, tcol), //width
                        tmpy = convert.h(TestSize, (string)item.h, p),  //height
                        convert.cor((string)item.background)), //background
                        printc.align((string)item.align) //align
                        );

                    if (col == null)
                    {
                        y += tmpy;
                    }
                    else
                    {
                        col.Add( tmpy);
                    }
                    break;
                case "col":
                    if ((string)item.size == "0")
                    {
                        int maxValue = col.Max();
                        y += maxValue;
                        col = null;
                        tcol = 0;
                    }
                    else
                    {
                        col = new List<int>();
                        tcol = Int32.Parse((string)item.size);
                    }
                    break;
                case "line":
                    e1.Graphics.DrawLine(new Pen(Color.Black, convert.psize((string)item.size)), 0, y += 10, (int)p.DefaultPageSettings.PrintableArea.Width, y);
                    y += 10;
                    break;
            }
        }
    };
    p.Print();


}
catch (Exception e)
{
    Console.Write("Erro " + e);
}

Этот код выполняется внутри работника, который читает данные с сервера и отправляет их этой функции. С наилучшими пожеланиями

1 Ответ

0 голосов
/ 02 ноября 2018

вам нужно будет профилировать ваш код в Visual Studio, которая имеет мощные инструменты профилирования даже в бесплатных версиях! Тогда хорошей отправной точкой будет https://docs.microsoft.com/en-us/visualstudio/profiling/?view=vs-2017 Вы можете начать с видео, связанного там.

Затем вам нужно понять, является ли низкая производительность привязкой к ЦП или что-то (например, в этом объекте PrintC) связано с внешними вызовами, ожидающими или ожидающими базу данных или реальный принтер.

Все остальное - просто догадки, поскольку ваш код не может быть протестирован где-либо еще без ваших внешних ссылок.

...