首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成10000矩阵条码

生成10000矩阵条码
EN

Code Review用户
提问于 2017-05-07 15:38:17
回答 2查看 139关注 0票数 1

当生成矩阵条形码时,每10000个文件需要1分钟,这就是如何在更短的时间内生成大量的矩阵条形码。

这里是用来编码数据的库。

我的按钮生成代码:

代码语言:javascript
复制
Class1 CLS = new Class1();
DataTable dt = CLS.ShowalldataSerial(textBox4.Text);

for (int i = 0; i <= Convert.ToInt32(textBox1.Text); i++)
{
    Serial = SRL.Rnd().ToString();
    txt = "UserID" + dt.Rows[0][0] + "FirmName" + dt.Rows[0][1] + "OrderNo" + dt.Rows[0][2] + "BtachNo" + dt.Rows[0][3] + "Quantity" + dt.Rows[0][4] + "ProductName" + dt.Rows[0][5] + "SerialNo" + Serial;

    dm.DM(txt, Color.FromName(comboBox1.SelectedItem.ToString()), Color.White).Save(root + "\\" + Serial + ".emf", System.Drawing.Imaging.ImageFormat.Emf);

}
MessageBox.Show("Records generated success ");

当在textbox1中创建10000时,需要1分钟。如果我用textbox1写200000,要花20分钟。

代码工作正常,没有任何问题,给出了我需要的结果,但速度很慢。有人能帮我加快速度吗?

EN

回答 2

Code Review用户

回答已采纳

发布于 2017-05-07 15:54:19

  1. 字符串是不可变的,因此每当您将它们连接起来时,每次都有效地创建新实例,这会大大降低性能,而是使用StringBuilderAppend()方法来构建字符串。
  2. 避免每个周期重复操作,除非是必要的,例如Convert.ToInt32(textBox1.Text)在for循环之前将值转换为int,并将值保存在变量中,而不是以后使用变量而不是每次转换值。另一个例子是comboBox1.SelectedItem.ToString()
票数 3
EN

Code Review用户

发布于 2017-05-08 09:21:26

我完全同意丹尼斯的回答。除此之外,我还要补充一句:

  1. 每个条形码只需要6毫秒,包括保存到磁盘:它在一天结束时并不慢,而且你有一个自定义库来完成大部分的工作,所以这意味着你必须压缩每一个可能的毫秒的分数。
  2. 在每个循环中,您已经知道了最终字符串的大小(只需添加if的每个部分的长度),所以当实例StringBuilder时,使用这个数字来设置初始容量。或者,以防万一,将其设置为最大可能的字符串长度,看看什么更快。
  3. 用一个平行的。如果这个东西在一个普通的工作PC上运行,比如说一个8核,从6ms到1ms可能是一个合理的方案。即使考虑到你需要为每个条形码设置一个新的编码器,我要说的是,至少最后一次会降到一半,甚至三分之一是现实的。
  4. 为循环变量指定适当的名称。

编辑

对不起,我又在想上面的第4点,被一个疑问所打动,又被检查了一遍,这里你做的事情根本没有意义:

代码语言:javascript
复制
txt = "UserID" + dt.Rows[0][0] + "FirmName" + dt.Rows[0][1] + "OrderNo" + dt.Rows[0][2] + "BtachNo" + dt.Rows[0][3] + "Quantity" + dt.Rows[0][4] + "ProductName" + dt.Rows[0][5] + "SerialNo" + Serial;

您正在每个循环中重新构建完全相同的基字符串,一次又一次,这有什么意义?除了序列号之外,您的字符串是相同的,所以在for循环之外构建一次并重用它。您甚至不需要在这里使用StringBuilder,因为通常情况下,当您连接超过3个字符串时,它开始变得更快,否则普通的普通字符串连接更好。

编辑2,应OP请求

像这样的事情应该可以做到:

代码语言:javascript
复制
    Class1 CLS = new Class1();
    DataTable dt = CLS.ShowalldataSerial(textBox4.Text);

    string baseText = "UserID" + dt.Rows[0][0] + "FirmName" + dt.Rows[0][1] + "OrderNo" + dt.Rows[0][2] + "BtachNo" + dt.Rows[0][3] + "Quantity" + dt.Rows[0][4] + "ProductName" + dt.Rows[0][5] + "SerialNo";
    Color foregroundColor = Color.FromName(comboBox1.SelectedItem.ToString());

    int serialsToGenerate = Convert.ToInt32(textBox1.Text);
    Parallel.For(0, serialsToGenerate, index=>
    {
        string Serial = SRL.Rnd().ToString();
        string txt = baseText + Serial;

        // WARNING HERE
        DM_Encoder dm = new DM_Encoder();
        dm.DM(txt, foregroundColor, Color.White).Save(root + "\\" + Serial + ".emf", System.Drawing.Imaging.ImageFormat.Emf);
    });

Parallel.For的内容将在多线程中执行,因此您需要一个您修改的每个变量的唯一实例,并且对于您调用的方法的每个类都需要一个唯一的实例,因此请注意

代码语言:javascript
复制
// WARNING HERE

因为我不知道您以前是如何安装和设置dm对象的,所以这里也需要这样做;我只是向构造函数添加了一个泛型调用,以帮助您理解。

另一个很大的警告是:你需要了解多线程编程,否则这段代码迟早会在你面前爆炸。通常是在最糟糕的时刻。

票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/162767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档