工作中遇到这么一个场景:
从Excel有中读取了大量数据,然后根据数据转为对象实体
(实体属性类型为double?,将单元格内容赋给实体属性)
问题是:在Excel中有大量的正确可转double的数据,但也有小量单元格的内容为空、空格、文本字符等。
多线程运行过程中发现有空白单元格时转换为实体特别慢;下面用了三种方法测试效率:
第一种,先判断单元格的object数据(单元格里提取到C#数组里的格式都是object)是否为空,然后再转String,再转double
第二种,先将object数据转为String,再转double
第三种,不拆箱,直接将object数据转为double测试结果
当 源数据中错误率为2/20时,即(26行代码:else if (i % 20 == 1|| i % 20 == 2))
当 源数据中错误率为1/20时,即(else if (i % 20 == 1))
测试结论:
第二种最慢(慢好多,不是差一点),一三相差不大求助:
即使是一三,效率也太慢了,我现在一个object[45,108]转成一个实体,要需要3分钟时间,
请高手帮忙指点下。测试代码:namespace WindowsFormsApp10
{
public class A
{
public Double? a;
}
public partial class Form1 : Form
{
System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
public Form1()
{
InitializeComponent();
} private void button2_Click(object sender, EventArgs e)
{
List<object> oa = new List<object>();
List<A> TestA = new List<A>();
List<A> TestB = new List<A>();
List<A> TestC = new List<A>(); for (int i = 0; i < 9999; i++)
{
if (i % 20 == 0)
{ oa.Add(null); }
else if (i % 20 == 1)
{
oa.Add("杂");
//oa.Add(i);
}
else
{ oa.Add(i); }
} stopwatch.Start();
for (int i = 0; i < 9999; i++)
{
if (oa[i] == null) continue;
string ss = oa[i].ToString();
try
{
TestA.Add(new A() { a = Convert.ToDouble(ss) });
}
catch
{
TestA.Add(new A() { a = null });
} }
stopwatch.Stop();
Console.WriteLine("一、先判断再用ToString拆箱,费时" + stopwatch.Elapsed.TotalSeconds); stopwatch.Reset();
stopwatch.Start();
for (int i = 0; i < 9999; i++)
{
string ss = Convert.ToString(oa[i]);
try
{
TestB.Add(new A() { a = Convert.ToDouble(ss) });
}
catch
{
TestB.Add(new A() { a = null });
} }
stopwatch.Stop();
Console.WriteLine("二、不判断直接用Convert.ToString拆箱,费时" + stopwatch.Elapsed.TotalSeconds); stopwatch.Reset();
stopwatch.Start();
for (int i = 0; i < 9999; i++)
{
try
{
TestC.Add(new A() { a = Convert.ToDouble(oa[i]) });
}
catch
{
TestC.Add(new A() { a = null });
}
}
stopwatch.Stop();
Console.WriteLine("三、不拆箱,强制转,费时" + stopwatch.Elapsed.TotalSeconds);
stopwatch.Reset();
stopwatch.Start();
stopwatch.Stop();
Console.WriteLine(stopwatch.Elapsed.TotalSeconds); Console.ReadLine();
}
}
}
从Excel有中读取了大量数据,然后根据数据转为对象实体
(实体属性类型为double?,将单元格内容赋给实体属性)
问题是:在Excel中有大量的正确可转double的数据,但也有小量单元格的内容为空、空格、文本字符等。
多线程运行过程中发现有空白单元格时转换为实体特别慢;下面用了三种方法测试效率:
第一种,先判断单元格的object数据(单元格里提取到C#数组里的格式都是object)是否为空,然后再转String,再转double
第二种,先将object数据转为String,再转double
第三种,不拆箱,直接将object数据转为double测试结果
当 源数据中错误率为2/20时,即(26行代码:else if (i % 20 == 1|| i % 20 == 2))
当 源数据中错误率为1/20时,即(else if (i % 20 == 1))
测试结论:
第二种最慢(慢好多,不是差一点),一三相差不大求助:
即使是一三,效率也太慢了,我现在一个object[45,108]转成一个实体,要需要3分钟时间,
请高手帮忙指点下。测试代码:namespace WindowsFormsApp10
{
public class A
{
public Double? a;
}
public partial class Form1 : Form
{
System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
public Form1()
{
InitializeComponent();
} private void button2_Click(object sender, EventArgs e)
{
List<object> oa = new List<object>();
List<A> TestA = new List<A>();
List<A> TestB = new List<A>();
List<A> TestC = new List<A>(); for (int i = 0; i < 9999; i++)
{
if (i % 20 == 0)
{ oa.Add(null); }
else if (i % 20 == 1)
{
oa.Add("杂");
//oa.Add(i);
}
else
{ oa.Add(i); }
} stopwatch.Start();
for (int i = 0; i < 9999; i++)
{
if (oa[i] == null) continue;
string ss = oa[i].ToString();
try
{
TestA.Add(new A() { a = Convert.ToDouble(ss) });
}
catch
{
TestA.Add(new A() { a = null });
} }
stopwatch.Stop();
Console.WriteLine("一、先判断再用ToString拆箱,费时" + stopwatch.Elapsed.TotalSeconds); stopwatch.Reset();
stopwatch.Start();
for (int i = 0; i < 9999; i++)
{
string ss = Convert.ToString(oa[i]);
try
{
TestB.Add(new A() { a = Convert.ToDouble(ss) });
}
catch
{
TestB.Add(new A() { a = null });
} }
stopwatch.Stop();
Console.WriteLine("二、不判断直接用Convert.ToString拆箱,费时" + stopwatch.Elapsed.TotalSeconds); stopwatch.Reset();
stopwatch.Start();
for (int i = 0; i < 9999; i++)
{
try
{
TestC.Add(new A() { a = Convert.ToDouble(oa[i]) });
}
catch
{
TestC.Add(new A() { a = null });
}
}
stopwatch.Stop();
Console.WriteLine("三、不拆箱,强制转,费时" + stopwatch.Elapsed.TotalSeconds);
stopwatch.Reset();
stopwatch.Start();
stopwatch.Stop();
Console.WriteLine(stopwatch.Elapsed.TotalSeconds); Console.ReadLine();
}
}
}
stopwatch.Start();
for (int i = 0; i < 9999; i++)
{
TestC.Add(new A()
{
a = oa[i] is int ii ? ii :
oa[i] is double dd ? dd :
(double?)null,
});
}
stopwatch.Stop();
Console.WriteLine("四、费时" + stopwatch.Elapsed.TotalSeconds);