First commit

This commit is contained in:
didier committed 2024-09-07 20:48:02 -04:00
commit 61700e7b59
5 files changed
+181

No files matched your search

+8
View File
@@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
+7
View File
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component>
</project>
+14
View File
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_22" default="true" project-jdk-name="22" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
+30
View File
@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>stream-examples</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>22</maven.compiler.source>
<maven.compiler.target>22</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>1.37</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>1.37</version>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,122 @@
package com.alldressedprogramming;
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.infra.Blackhole;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.IntStream;
import java.util.stream.LongStream;
import java.util.stream.Stream;
@State(Scope.Benchmark)
public class Main {
public record Song(List<String> composers) {
}
public record Album(List<Song> songs, int releaseYear) {
}
public static Song createFakeSong(Random random){
var composers = IntStream.range(1,10)
.map(i -> random.nextInt(0, 100))
.mapToObj(i -> i == 0 ? "taylor swift" : "not taylor swift #" + i )
.toList();
return new Song(composers);
}
public static Album createFakeAlbum(Random random) {
var seed = random.nextLong();
var songs = IntStream.range(2, 25)
.mapToObj(Random::new)
.map(Main::createFakeSong)
.toList();
return new Album(songs, random.nextInt(1990, 2024));
}
public static List<Album> createFakeAlbums(int n) {
return LongStream.range(0, n)
.mapToObj(Random::new)
.map(Main::createFakeAlbum)
.toList();
}
List<Album> albums;
@Setup(Level.Invocation)
public void setUp() {
albums = createFakeAlbums(1000);
}
@Benchmark
public void classical(Blackhole blackhole) {
List<Song> newTaylorSwift = new ArrayList<>();
for(Album album: albums){
if(album.releaseYear() > 2020){
for(Song song: album.songs()){
if(song.composers().contains("taylor swift")){
newTaylorSwift.add(song);
}
}
}
}
blackhole.consume(newTaylorSwift);
}
public List<Album> getRecentAlbums(List<Album> albums){
List<Album> ret = new ArrayList<>();
for(Album album: albums){
if(album.releaseYear() > 2020){
ret.add(album);
}
}
return ret;
}
public List<Song> getTaylorSwiftSongs(List<Album> albums){
List<Song> ret = new ArrayList<>();
for(Album album: albums){
for(Song song: album.songs()){
if(song.composers().contains("taylor swift")){
ret.add(song);
}
}
}
return ret;
}
@Benchmark
public void brokenDownWithMethods(Blackhole blackhole) {
List<Album> recentAlbums = getRecentAlbums(albums);
List<Song> newTaylorSwift = getTaylorSwiftSongs(recentAlbums);
blackhole.consume(newTaylorSwift);
}
public Stream<Album> getRecentAlbumsAsStream(Stream<Album> albums){
return albums.filter(album -> album.releaseYear() > 2020);
}
public Stream<Song> getTaylorSwiftSongsAsStream(Stream<Album> albums){
return albums
.flatMap(album -> album.songs().stream())
.filter(song -> song.composers().contains("taylor swift"));
}
@Benchmark
public void brokenDownWithMethodsWithStreams(Blackhole blackhole) {
Stream<Album> recentAlbums = getRecentAlbumsAsStream(albums.stream());
Stream<Song> newTaylorSwift = getTaylorSwiftSongsAsStream(recentAlbums);
blackhole.consume(newTaylorSwift);
}
public static void main(String[] args) throws Exception {
org.openjdk.jmh.Main.main(args);
}
}