如何在Java中有效地生成大量实例

  • 本文关键字:实例 有效地 Java java
  • 更新时间 :
  • 英文 :


我有一个类,它有5个可能不同的属性,每个属性都有一个特定的值范围(确切地说是64个不同的值(,我正在尝试生成每个不同的可能结果
我估计总共会有超过50万个该类的uniques实例。我的目标是生成所有唯一的结果,并将它们存储在数据库中以备将来使用。如果";发电机";可以容易地升级或高效地重用。

我创建那个帖子的原因是,我想知道是否有一种方法可以让我有效地生成,而不是一个接一个地做每一个都有细微的差异。我最初想过尝试多线程,但我不习惯,所以它甚至可能不接近我想要的。

我使用的是java8,但我没有绑定到那个版本。

如果我的解释不够清楚,我很抱歉,如果我在写这篇文章时犯了一些错误,请原谅。谢谢你的阅读,祝你今天愉快。

创建50万个对象需要半秒

创建50万个具有五个字段的对象需要不到半秒的时间。请参阅下面的示例代码。因此,您似乎陷入了过早优化的陷阱,在实际证明性能问题之前就预期会出现性能问题。

正如我所评论的,你的数学让我很困惑。你将五个属性中每个属性的64个值组合在一起,预计会有50万个实例。但笛卡尔乘积64^5=1073741824——超过10亿,而不是50万。

因此,在下面的例子中,我使用了3个属性,每个属性有64个值,并创建了两次,总共524288个,接近您想要的50万。

为了把事情搞混,我改变了三个属性的数据类型:自定义枚举、LocalDate对象和Locale对象。

为了使事情更具挑战性,该示例动态生成UUID并捕获当前时刻。

package work.basil.many;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDate;
import java.time.Month;
import java.util.*;
public class Many
{
public static void main ( String[] args )
{
Many app = new Many();
app.demo();
}
private void demo ( )
{
// Initialize.
long start = System.nanoTime();
enum Color
{
AliceBlue, AntiqueWhite, Aqua, Aquamarine, Azure, Beige, Bisque, Black, BlanchedAlmond, Blue, BlueViolet, Brown, BurlyWood, CadetBlue, Chocolate, Coral,
CornflowerBlue, Cornsilk, Crimson, Cyan, DarkBlue, DarkCyan, DarkGoldenRod, DarkGray, DarkGreen, DarkKhaki, DarkMagenta, DarkOliveGreen, DarkOrange,
DarkOrchid, DarkRed, DarkSalmon, DarkSeaGreen, DarkSlateBlue, DarkSlateGray, DarkTurquoise, DarkViolet, DeepPink, DeepSkyBlue, DimGray, DodgerBlue,
FireBrick, FloralWhite, ForestGreen, Fuchsia, Gainsboro, GhostWhite, Gold, GoldenRod, Gray, Green, GreenYellow, HoneyDew, HotPink, IndianRed, Indigo,
Ivory, Khaki, Lavender, LavenderBlush, LawnGreen, LemonChiffon, LightBlue, LightCoral
}
LocalDate startDate = LocalDate.of( 2022 , Month.JANUARY , 1 );
List < LocalDate > dates = startDate.datesUntil( startDate.plusDays( 64 ) ).toList();
List < Locale > locales = Arrays.stream( Locale.getAvailableLocales() ).limit( 64 ).toList();
record Blah( UUID id , Instant instant , Color color , LocalDate date , Locale locale )
{
}
// Populate.
List < Blah > blahs = new ArrayList <>( ( int ) Math.pow( 64 , 3 ) * 2 );
for ( int i = 1 ; i <= 2 ; i++ )
{
for ( Color color : Color.values() )
{
for ( LocalDate date : dates )
{
for ( Locale locale : locales )
{
blahs.add( new Blah( UUID.randomUUID() , Instant.now() , color , date , locale ) );
}
}
}
}
// Report.
System.out.println( "blahs.size() = " + blahs.size() );
System.out.println( "blahs.get(0) = " + blahs.get( 0 ) );  // First.
System.out.println( "blahs.get(blahs.size()) = " + blahs.get( blahs.size() - 1 ) );  // Last.
Duration elapsed = Duration.ofNanos( System.nanoTime() - start );
System.out.println( "elapsed = " + elapsed );
}
}

当在带有Apple Silicon M1芯片和16 GB内存的MacBook Pro上用Java 17运行此代码时。

blahs.size() = 524288
blahs.get(0) = Blah[id=68f1478b-de38-4217-b28a-8f3b65c82e47, instant=2021-12-21T07:11:35.896362Z, color=AliceBlue, date=2022-01-01, locale=]
blahs.get(blahs.size()) = Blah[id=58b1e46f-e09a-42a2-819f-e35bae197a27, instant=2021-12-21T07:11:36.224003Z, color=LightCoral, date=2022-03-05, locale=pl_PL_#Latn]
elapsed = PT0.406977625S

最新更新