Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import org.openjdk.jmh.annotations.Benchmark;
- public class StackWalkerExtraction {
- private static Object call(int depth, Callable<?> result) throws Exception {
- if (depth == 0) {
- return result.call();
- } else {
- return call(depth - 1, result);
- }
- }
- @Benchmark
- public Object snapshot() throws Exception {
- return call(100, () -> StackWalker.getInstance().walk(new InstanaWalker(35, 0)));
- }
- @Benchmark
- public Object complete() throws Exception {
- return call(100, () -> StackWalker.getInstance().walk(new InstanaWalker(35, 0)));
- }
- private class RawWalker implements Function<Stream<StackWalker.StackFrame>, StackWalker.StackFrame[]> {
- private final int stackDepth, startFrame;
- RawWalker(int stackDepth, int startFrame) {
- this.stackDepth = stackDepth;
- this.startFrame = startFrame;
- }
- @Override
- public StackWalker.StackFrame[] apply(Stream<StackWalker.StackFrame> stackFrameStream) {
- StackWalker.StackFrame[] elements = new StackWalker.StackFrame[stackDepth];
- Iterator<StackWalker.StackFrame> it = stackFrameStream.skip(startFrame).limit(stackDepth).iterator();
- int index = 0;
- while (it.hasNext()) {
- elements[index++] = it.next();
- }
- return elements;
- }
- }
- private class TransformingWalker implements Function<Stream<StackWalker.StackFrame>, StackWalker.StackFrame[]> {
- private final int stackDepth, startFrame;
- TransformingWalker(int stackDepth, int startFrame) {
- this.stackDepth = stackDepth;
- this.startFrame = startFrame;
- }
- @Override
- public StackFrameElement[] apply(Stream<StackWalker.StackFrame> stackFrameStream) {
- StackFrameElement[] elements = new StackWalker.StackFrame[stackDepth];
- Iterator<StackWalker.StackFrame> it = stackFrameStream.skip(startFrame).limit(stackDepth).iterator();
- int index = 0;
- while (it.hasNext()) {
- elements[index++] = it.next().toStackFrameElement();
- }
- return elements;
- }
- }
- }
Add Comment
Please, Sign In to add comment