public EBPFProfilingTree buildAnalyzeResult() {
        // all nodes add to single-level list (such as flat), work for parallel calculating
        LinkedList<Tuple2<EBPFProfilingStackElement, EBPFProfilingStackNode>> nodeMapping = new LinkedList<>();
        int idGenerator = 1;

        EBPFProfilingStackElement root = buildElement(idGenerator++);
        nodeMapping.add(new Tuple2<>(root, this));

        // same with combine logic
        LinkedList<Tuple2<EBPFProfilingStackElement, EBPFProfilingStackNode>> stack = new LinkedList<>();
        stack.add(Tuple.of(root, this));
        while (!stack.isEmpty()) {
            Tuple2<EBPFProfilingStackElement, EBPFProfilingStackNode> mergingPair = stack.pop();
            EBPFProfilingStackElement respElement = mergingPair._1;

            // generate children node and add to stack and all node mapping
            for (EBPFProfilingStackNode children : mergingPair._2.children) {
                EBPFProfilingStackElement element = children.buildElement(idGenerator++);
                element.setParentId(respElement.getId());

                Tuple2<EBPFProfilingStackElement, EBPFProfilingStackNode> pair = Tuple.of(element, children);
                stack.add(pair);
                nodeMapping.add(pair);
            }
        }

        EBPFProfilingTree tree = new EBPFProfilingTree();
        nodeMapping.forEach(n -> tree.getElements().add(n._1));

        return tree;
    }
build GraphQL result, calculate duration and count data using parallels
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/profiling/ebpf/analyze/EBPFProfilingStackNode.java