将异常的堆栈跟踪转换为 byte[] 数组或 ByteBuffer (Java) 是不是更有效?

Posted

技术标签:

【中文标题】将异常的堆栈跟踪转换为 byte[] 数组或 ByteBuffer (Java) 是不是更有效?【英文标题】:Is it more efficient to convert an exception's stack trace into byte[] array or ByteBuffer (Java)?将异常的堆栈跟踪转换为 byte[] 数组或 ByteBuffer (Java) 是否更有效? 【发布时间】:2012-09-19 17:06:47 【问题描述】:

我需要将异常记录到数据库中。数据库 API 声明我可以将值作为 ByteBuffer 或 byte[] 数组传递。那么哪个更高效呢?

private final static byte[] getThrowableStackTraceBytes(Throwable throwable) 
    StringWriter throwableStackTraceStringWriter = new StringWriter();
    throwable.printStackTrace(new PrintWriter(throwableStackTraceStringWriter));
    return throwableStackTraceStringWriter.toString().getBytes();

对比

private final static ByteBuffer getThrowableStackTraceByteBuffer(Throwable throwable) 
    ByteArrayOutputStream throwableStackTraceByteArrayOutputStream = new ByteArrayOutputStream();
    throwable.printStackTrace(new PrintStream(throwableStackTraceByteArrayOutputStream));
    ByteBuffer throwableByteBuffer = ByteBuffer.wrap(throwableStackTraceByteArrayOutputStream.toByteArray());
    return throwableByteBuffer;

我认为如果我使用 ByteBuffer,整体操作会更有效率,尤其是在它被传递到数据库方法之后进行处理时。我说的对吗?

(具体来说,我需要将异常记录到 Hypertable 中,它使用 Thrift Java API。)

【问题讨论】:

您是否尝试过对差异进行基准测试?这是您的应用程序中的一个重大瓶颈吗? 你为什么要使用字节?堆栈跟踪不是更自然地存储为字符串吗?另外,为什么要关注效率?如果您获得足够多的例外以使效率成为问题,那么您将遇到更大的问题。而是解决这些问题。 目前还没有瓶颈或效率问题。我刚刚开始编写服务器应用程序。正确记录所有异常只是一个好习惯。 好吧,我刚刚检查了数据库 API。传递 byte[] 数组或 ByteBuffer 将是相同的,因为前者将被包装到 ByteBuffer 中。 我同意性能和日志记录异常都很重要。但是日志记录异常的性能可能不如该日志记录代码的其他方面重要。您在日志记录方面的努力可能会更好地用于捕获正确信息、使其可靠、快速进行非异常日志记录等事情。 【参考方案1】:

最有效的选择是两者的结合。

private final static byte[] getThrowableStackTraceBytes(Throwable throwable) 
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    throwable.printStackTrace(new PrintStream(baos));
    return baos.toByteArray();

虽然我怀疑将其写入数据库会贵很多倍。

【讨论】:

返回方法“return baos.toByteArray();” - 返回 byte[] - 不起作用,因为返回类型是 ByteBuffer。

以上是关于将异常的堆栈跟踪转换为 byte[] 数组或 ByteBuffer (Java) 是不是更有效?的主要内容,如果未能解决你的问题,请参考以下文章

请问:从字符串转换日期和/或时间时,转换失败。怎么修改

如何将 Byte 数组转换为 PrivateKey 或 PublicKey 类型?

引发类型为“System.OutOfMemoryException”的异常。

如何将字节数组转换为其数值(Java)?

delphi中string如何转换为byte.注意只是byte,不是byte数组!

C# 就地将 `int[]` 数组转换为 `byte[]` 数组