[英]What is the fastest way to turn List that holds a class with fields into multiple arrays? -
I just want to have a confirm if this is the only fastest way to turn the class Data
fields into arrays, or this can be done better.我只是想确认这是否是将 class Data
字段转换为 arrays 的唯一最快方法,或者这可以做得更好。
First I have a class called Data
and it contains lot of fields.首先,我有一个名为Data
的 class ,它包含很多字段。 The class Data
is generated into a List<Data>
called selectedData
and I want to extract all the fields from Data
into Float[]
arrays. class Data
生成到名为selectedData
的List<Data>
中,我想将Data
中的所有字段提取到Float[]
arrays 中。
Can this be done in a faster way?这可以以更快的方式完成吗?
// Fill the values for the plot
int selectedSamples = selectedData.size();
Float[] A0 = new Float[selectedSamples];
Float[] A1 = new Float[selectedSamples];
Float[] A2 = new Float[selectedSamples];
Float[] A3 = new Float[selectedSamples];
Float[] SA0 = new Float[selectedSamples];
Float[] SA1 = new Float[selectedSamples];
Float[] SA1D = new Float[selectedSamples];
Float[] SA2D = new Float[selectedSamples];
Float[] SA3D = new Float[selectedSamples];
Float[] PWM0 = new Float[selectedSamples];
Float[] PWM1 = new Float[selectedSamples];
Float[] PWM2 = new Float[selectedSamples];
Float[] PWM3 = new Float[selectedSamples];
Float[] PWM4 = new Float[selectedSamples];
Float[] PWM5 = new Float[selectedSamples];
Float[] PWM6 = new Float[selectedSamples];
Float[] PWM7 = new Float[selectedSamples];
Float[] PWM8 = new Float[selectedSamples];
Float[] DAC0 = new Float[selectedSamples];
Float[] DAC1 = new Float[selectedSamples];
Float[] DAC2 = new Float[selectedSamples];
for(int i = 0; i < selectedSamples; i++){
Data data = selectedData.get(i);
A0[i] = data.getA0();
A1[i] = data.getA1();
A2[i] = data.getA2();
A3[i] = data.getA3();
SA0[i] = data.getSa0();
SA1[i] = data.getSa1();
SA1D[i] = data.getSa1d();
SA2D[i] = data.getSa2d();
SA3D[i] = data.getSa3d();
PWM0[i] = (float) data.getP0();
PWM1[i] = (float) data.getP1();
PWM2[i] = (float) data.getP2();
PWM3[i] = (float) data.getP3();
PWM4[i] = (float) data.getP4();
PWM5[i] = (float) data.getP5();
PWM6[i] = (float) data.getP6();
PWM7[i] = (float) data.getP7();
PWM8[i] = (float) data.getP8();
DAC0[i] = (float) data.getD0();
DAC1[i] = (float) data.getD1();
DAC2[i] = (float) data.getD2();
}
Edit编辑
Can this be an alternative?这可以替代吗?
SeriesThread a0Thread = new SeriesThread(selectedData, A0, "A0");
a0Thread.start();
SeriesThread a1Thread = new SeriesThread(selectedData, A1, "A1");
a1Thread.start();
SeriesThread a2Thread = new SeriesThread(selectedData, A2, "A2");
a2Thread.start();
SeriesThread a3Thread = new SeriesThread(selectedData, A3, "A3");
a3Thread.start();
SeriesThread sa0Thread = new SeriesThread(selectedData, SA0, "SA0");
sa0Thread.start();
SeriesThread sa1Thread = new SeriesThread(selectedData, SA1, "SA1");
sa1Thread.start();
SeriesThread sa1dThread = new SeriesThread(selectedData, SA1D, "SA1D");
sa1dThread.start();
SeriesThread sa2dThread = new SeriesThread(selectedData, SA2D, "SA2D");
sa2dThread.start();
SeriesThread sa3dThread = new SeriesThread(selectedData, SA3D, "SA3D");
sa3dThread.start();
SeriesThread pwm0Thread = new SeriesThread(selectedData, PWM0, "P0");
pwm0Thread.start();
SeriesThread pwm1Thread = new SeriesThread(selectedData, PWM1, "P1");
pwm1Thread.start();
SeriesThread pwm2Thread = new SeriesThread(selectedData, PWM2, "P2");
pwm2Thread.start();
SeriesThread pwm3Thread = new SeriesThread(selectedData, PWM3, "P3");
pwm3Thread.start();
SeriesThread pwm4Thread = new SeriesThread(selectedData, PWM4, "P4");
pwm4Thread.start();
SeriesThread pwm5Thread = new SeriesThread(selectedData, PWM5, "P5");
pwm5Thread.start();
SeriesThread pwm6Thread = new SeriesThread(selectedData, PWM6, "P6");
pwm6Thread.start();
SeriesThread pwm7Thread = new SeriesThread(selectedData, PWM7, "P7");
pwm7Thread.start();
SeriesThread pwm8Thread = new SeriesThread(selectedData, PWM8, "P8");
pwm8Thread.start();
SeriesThread dac0Thread = new SeriesThread(selectedData, DAC0, "D0");
dac0Thread.start();
SeriesThread dac1Thread = new SeriesThread(selectedData, DAC1, "D1");
dac1Thread.start();
SeriesThread dac2Thread = new SeriesThread(selectedData, DAC2, "D2");
dac2Thread.start();
// Wait until all threads are not alive
while(a0Thread.isAlive() ||
a1Thread.isAlive() ||
a2Thread.isAlive() ||
a3Thread.isAlive() ||
sa0Thread.isAlive() ||
sa1Thread.isAlive() ||
sa1dThread.isAlive() ||
sa2dThread.isAlive() ||
sa3dThread.isAlive() ||
pwm0Thread.isAlive() ||
pwm1Thread.isAlive() ||
pwm2Thread.isAlive() ||
pwm3Thread.isAlive() ||
pwm4Thread.isAlive() ||
pwm5Thread.isAlive() ||
pwm6Thread.isAlive() ||
pwm7Thread.isAlive() ||
pwm8Thread.isAlive() ||
dac0Thread.isAlive() ||
dac1Thread.isAlive() ||
dac2Thread.isAlive()) {}
Where the thread class is:其中螺纹 class 是:
public class SeriesThread extends Thread {
private List<Data> selectedData;
private Float[] seriesData;
private String fieldName;
public SeriesThread(List<Data> selectedData, Float[] seriesData, String fieldName) {
this.selectedData = selectedData;
this.seriesData = seriesData;
this.fieldName = fieldName;
}
@Override
public void run() {
int i = 0;
switch(fieldName) {
case "A0":
for(Data data : selectedData)
seriesData[i++] = data.getA0();
break;
case "A1":
for(Data data : selectedData)
seriesData[i++] = data.getA1();
break;
case "A2":
for(Data data : selectedData)
seriesData[i++] = data.getA2();
break;
case "A3":
for(Data data : selectedData)
seriesData[i++] = data.getA3();
break;
case "SA0":
for(Data data : selectedData)
seriesData[i++] = data.getSa0();
break;
case "SA1":
for(Data data : selectedData)
seriesData[i++] = data.getSa1();
break;
case "SAD1":
for(Data data : selectedData)
seriesData[i++] = data.getSa1d();
break;
case "SAD2":
for(Data data : selectedData)
seriesData[i++] = data.getSa2d();
break;
case "SAD3":
for(Data data : selectedData)
seriesData[i++] = data.getSa3d();
break;
case "P0":
for(Data data : selectedData)
seriesData[i++] = (float) data.getP0();
break;
case "P1":
for(Data data : selectedData)
seriesData[i++] = (float) data.getP1();
break;
case "P2":
for(Data data : selectedData)
seriesData[i++] = (float) data.getP2();
break;
case "P3":
for(Data data : selectedData)
seriesData[i++] = (float) data.getP3();
break;
case "P4":
for(Data data : selectedData)
seriesData[i++] = (float) data.getP4();
break;
case "P5":
for(Data data : selectedData)
seriesData[i++] = (float) data.getP5();
break;
case "P6":
for(Data data : selectedData)
seriesData[i++] = (float) data.getP6();
break;
case "P7":
for(Data data : selectedData)
seriesData[i++] = (float) data.getP7();
break;
case "P8":
for(Data data : selectedData)
seriesData[i++] = (float) data.getP8();
break;
case "D0":
for(Data data : selectedData)
seriesData[i++] = (float) data.getD0();
break;
case "D1":
for(Data data : selectedData)
seriesData[i++] = (float) data.getD1();
break;
case "D2":
for(Data data : selectedData)
seriesData[i++] = (float) data.getD2();
break;
}
}
}
I did a simple test of 1 million entries.我对 100 万个条目做了一个简单的测试。 Using Float[]
arrays took about 2.5
seconds to copy the data.使用Float[]
arrays 复制数据大约需要2.5
秒。 Using float[]
arrays took about .38
seconds.使用float[]
arrays 大约需要.38
秒。 This was a basic test and didn't use anything as sophisticated as JMH but the delta is such that using primitive arrays is significantly faster.这是一个基本测试,没有使用任何像 JMH 那样复杂的东西,但增量是这样的,使用原始 arrays 明显更快。 I expect this is due to the overhead of boxing and unboxing of the the data.我预计这是由于数据装箱和拆箱的开销。
You may use reflection ( getCLass().getFields() and then iterate over them ) - it will be more generic but not really faster.您可以使用反射( getCLass().getFields() 然后迭代它们) - 它会更通用但不是真的更快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.