- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
InputStream
在 @Setup
中初始化,当试图在 @Benchmark
中使用它时关闭。更改 @State
不起作用。我这样做正确吗?有没有办法避免流初始化开销并进行适当的基准测试?
这对 XMLStreamReader
也不起作用,我正在做一个序列化反序列化基准测试,我想在基准分数中避免文件读取/流初始化成本。
样本基准
@State( Scope.Thread )
public class DeserializationBenchMark
{
@Param( { "1.xml", "10.xml", "100.xml" } )
String file;
private InputStream xmlFileInputStream;
@Setup
public void setup() throws JAXBException, IOException, SAXException, XMLStreamException
{
File xmlFile = new File( "src/main/resources/" + file );
xmlFileInputStream = Files.newInputStream( xmlFile.toPath() );
}
@Benchmark
public void jacksonDeserializeStreamTest( Blackhole bh ) throws IOException
{
bh.consume( objectMapper.readValue( xmlFileInputStream, Cat.class ) );
}
}
运行者
public class BenchMarkRunner
{
public static void main( String[] args ) throws RunnerException
{
Options opt = new OptionsBuilder()
.include( DeserializationBenchMark.class.getSimpleName() )
.forks( 1 )
.resultFormat( ResultFormatType.JSON )
.result( "deserialize-benchmark-report-" + LocalDateTime.now().format( DateTimeFormatter.ofPattern( "ddMMyyyy'T'hhmmss" ) ) + ".json" )
.mode( Mode.AverageTime )
.warmupIterations( 3 )
.measurementIterations( 5 )
.timeUnit( TimeUnit.MICROSECONDS )
.build();
new Runner( opt ).run();
}
}
这给出了
com.fasterxml.jackson.core.JsonParseException: N/A
at com.fasterxml.jackson.dataformat.xml.util.StaxUtil.throwAsParseException(StaxUtil.java:37)
at com.fasterxml.jackson.dataformat.xml.XmlFactory._createParser(XmlFactory.java:534)
at com.fasterxml.jackson.dataformat.xml.XmlFactory._createParser(XmlFactory.java:29)
at com.fasterxml.jackson.core.JsonFactory.createParser(JsonFactory.java:820)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3058)
at com.example.DeserializationBenchMark.jacksonDeserializeStreamTest(DeserializationBenchMark.java:118)
at com.example.generated.DeserializationBenchMark_jacksonDeserializeStreamTest_jmhTest.jacksonDeserializeStreamTest_avgt_jmhStub(DeserializationBenchMark_jacksonDeserializeStreamTest_jmhTest.java:186)
at com.example.generated.DeserializationBenchMark_jacksonDeserializeStreamTest_jmhTest.jacksonDeserializeStreamTest_AverageTime(DeserializationBenchMark_jacksonDeserializeStreamTest_jmhTest.java:150)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.openjdk.jmh.runner.BenchmarkHandler$BenchmarkTask.call(BenchmarkHandler.java:453)
at org.openjdk.jmh.runner.BenchmarkHandler$BenchmarkTask.call(BenchmarkHandler.java:437)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.nio.channels.ClosedChannelException
at sun.nio.ch.FileChannelImpl.ensureOpen(FileChannelImpl.java:110)
at sun.nio.ch.FileChannelImpl.read(FileChannelImpl.java:147)
at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:65)
at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:109)
at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:103)
at com.ctc.wstx.io.StreamBootstrapper.ensureLoaded(StreamBootstrapper.java:482)
at com.ctc.wstx.io.StreamBootstrapper.resolveStreamEncoding(StreamBootstrapper.java:306)
at com.ctc.wstx.io.StreamBootstrapper.bootstrapInput(StreamBootstrapper.java:167)
at com.ctc.wstx.stax.WstxInputFactory.doCreateSR(WstxInputFactory.java:573)
at com.ctc.wstx.stax.WstxInputFactory.createSR(WstxInputFactory.java:633)
at com.ctc.wstx.stax.WstxInputFactory.createSR(WstxInputFactory.java:647)
at com.ctc.wstx.stax.WstxInputFactory.createXMLStreamReader(WstxInputFactory.java:334)
at com.fasterxml.jackson.dataformat.xml.XmlFactory._createParser(XmlFactory.java:532)
... 18 more
任何建议都会很棒!谢谢。
附言:
正如@dit 提到的,它应该是流关闭,不知道为什么它会在第一次迭代时发生,
# Run progress: 0.00% complete, ETA 00:07:30
# Fork: 1 of 1
# Warmup Iteration 1: <failure>
com.fasterxml.jackson.core.JsonParseException: N/A
at com.fasterxml.jackson.dataformat.xml.util.StaxUtil.throwAsParseException(StaxUtil.java:37)
at com.fasterxml.jackson.dataformat.xml.XmlFactory._createParser(XmlFactory.java:534)
at com.fasterxml.jackson.dataformat.xml.XmlFactory._createParser(XmlFactory.java:29)
at com.fasterxml.jackson.core.JsonFactory.createParser(JsonFactory.java:820)
最佳答案
长话短说
问题是第一个热身方法调用成功了,但下一个却没有。尝试添加 System.out.println("method call");
你会看到我的意思:
> # Run progress: 0,00% complete, ETA 00:00:11
> # Fork: 1 of 1
> # Warmup Iteration 1: method call
> method call
> <failure>
每次调用 objectMapper.readValue(..)
后,使用过的 InputStream 将被关闭,不能再次使用:
Caused by: java.nio.channels.ClosedChannelException
你可以尝试这样的事情:
@Param( { "1.xml", "10.xml", "100.xml" } )
String file;
private String jsonData;
@Setup
public void setup() {
jsonData = getContent(file);
}
@Benchmark
public void jacksonDeserializeStreamTest(Blackhole bh) throws IOException {
bh.consume(objectMapper.readValue(jsonData, Cat.class));
}
private static String getContent(String fileName) {
try {
InputStream stream = PersonGenerator.class.getClassLoader().getResourceAsStream(fileName);
ByteArrayOutputStream result = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = stream.read(buffer)) != -1) {
result.write(buffer, 0, length);
}
return result.toString("UTF-8");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
您可以尝试类似的基准测试:Gson-vs-Jackson-Benchmark
编辑
不幸的是,您不能使用多个 InputStream:Java I/O - Reuse InputStream Object
但也许你可以试试这个(伪代码!):
String rawData = getContent("cats.json");
StringReader reader = new StringReader(rawData);
[...]
reader.mark(0); // reset
m.readValue(reader, type);
[...]
关于java - 在JMH @Setup 中初始化FileInputStream 并在@Benchmark 中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54575284/
这可能有点傻,但我想知道后台操作的区别。 InputStream is = new FileInputStream(filepath); FileInputStream is = new FileIn
优点: 所以,我有这个二进制数据文件(大小 - 恰好 640631 字节),我正试图让 Java 读取它。 我有两个可互换的类实现为读取该数据的层。其中之一使用 RandomAccessFile,效果
问题是当我在 Android Studio 中运行我的程序时,FileInputStream 找不到 c:\poi-test.xls 文件。 我在 Android Studio 中运行的简单测试 ja
Scanner scanner= new Scanner(new File("target.txt")); 和 FileInputStream d = new FileInputStream("tar
我有 @Component public class CodesConverterService { private final FileInputStreamFactory fileInput
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我正在创建一个程序,用于根据 iTunes 播放列表文件从用户的计算机播放音乐。当我尝试根据播放列表文本文件中提供的位置打开音频文件时,它说存在错误。 filename = "Macintosh HD
我需要读取的文件如下所示: 30 15 6 3 12 20 3 4 (没有要点) inputStream 没有读取 30 和 15,但它正在读取所有其他的。 如何让 inputStream 读取第一行
我收到“找不到文件!”无论我做什么。 FileInputStream fin; try { fin = new FileInputStream("foo.txt");
public static void main(String[] args) { try { File f = new File("file.txt");
我正在加载另一个类通过 FileOutputstream 方法保存的文件。无论如何,我想在另一个类中加载该文件,但它要么给我语法错误,要么使我的应用程序崩溃。 我能找到的唯一教程是在同一个类中保存和加
我在 res/raw 中有一个名为“pack.dat”的原始文件。 我可以使用以下代码打开一个InputStream: InputStream fis = null; try {
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度的了解。包括尝试的解决方案、为什么它们不起作用以及预期结果
我已经对我的代码进行了 klocwork 代码分析。我收到以下错误我终于关闭了输入流即使那样我也收到错误“fileInputStream”在退出时未关闭。 下面是一段代码 LOGGER.log
我想逐个标记地读取 file.txt 文件中的单词,并向每个标记添加词性标记,然后将其写入 file2.text 文件。 file.txt 内容已标记化。这是我的代码。 public class Po
“Dbconnection.java”“db.properties”文件找不到该文件。我向您展示如何获取以下文件。 我的下一个项目目录。 源代码 数据库 DbConnection.java db.pr
如果我将文本文件放在同一项目文件夹中,程序可以毫无问题地读取它。但是我怎样才能让它从我的计算机中的某个地方读取文件(例如:在桌面中) FileInputStream fstream = new Fil
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
这是我将位图转换为字节数组的代码。 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); image.compress
我是 Java 编码的新手,遇到了很多困难。我假设使用从文件中读取的 bufferedreader 编写一个程序,我已经创建了名为“scores.txt”的文件。所以我有一个名为 processFil
我是一名优秀的程序员,十分优秀!