如何遍历map

我们都知道ebpf为什么提供了一个内核态到用户态的一个数据交互中心, 这个数据交互中心就是bpf map, 在之前的一篇文章中我向你介绍了如何使用bpf map中的 array 改进 debug fs带来的一些问题。

这一篇, 我们主要想向你介绍如何在用户态遍历我们的bpf map的hash map。首先我们分析一下我们的hash map的使用场景。

在很多性能分析的场景中,当我们需要去统计一个线程需要执行多少次,比如我们需要统计有多少个 sh 进程正在执行的。我们就可以使用 bpf map 中的 hash map。我们可以把进程的名称设置为对应的键, 然后初始值设置为0, 对应的线程每执行一次,我们就让对应的值加上1。

probe sys_enter_execve{
   
   
    map[comm()] |> count();
    out("name: %-16s %6d", comm(), map[comm()]);
}

输出的结果如下:

name: node                  0
name: sh                    0
name: node                  1
name: sh                    1
name: node                  2
name: sh                    2
name: cpuUsage.sh           0
name: cpuUsage.sh           1
name: cpuUsage.sh           2
name: cpuUsage.sh           3
name: cpuUsage.sh           4
name: barad_agent           0
name: sh                    3
name: sh                    4
name: sh                    5

观察上面的输出结果, 我们通用可以发现一个问题, 那就是, 这是结果是实时的, 也就是说执行一次就输出一次当前线程对应的map值, 也就是当前线程执行的次数。但是这样其实是不适合我们观察数据的。

那么怎样才能将我们的数据格式变得非常清晰呢, 一种非常好的方式就是就是在跟踪结束的时候遍历map按照顺序输出每一个键值对。我们可以看一下bpftrace的做法:

bpftrace -e 'tracepoint:raw_syscalls:sys_enter {
   
    @[comm] = count(); }'

然后是输出结果

@[dockerd]: 7
@[code-b58957e67e]: 10
@[ntpd]: 12
@[sudo]: 18
@[cpptools-srv]: 22
@[cpptools]: 34
@[sleep]: 43
@[multipathd]: 47
@[tat_agent]: 49
@[bpftrace]: 63
@[dirname]: 63
@[chmod]: 64
@[which
### 如何遍历 Map 数据结构 在 Java 编程中,`Map` 是一种非常有用的数据结构,用于存储键对。为了有效地访问这些数据,可以采用多种方式进行遍历。 #### 使用 `forEach` 方法遍历 Map (Java 8 及以上版本) 自 Java 8 起,通过 Stream API 和 lambda 表达式的引入,使得遍历变得更为简便直观。下面展示了一个利用 `forEach` 来迭代整个映射表的例子: ```java import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) { // 创建并填充 HashMap 实例 Map<String, Integer> map = new HashMap<>(); map.put("apple", 1); map.put("banana", 2); map.put("orange", 3); // 使用 forEach 配合 Lambda 表达式遍历 key-value 对 map.forEach((key, value) -> System.out.println(key + ": " + value)); } } ``` 这段程序会依次打印出每一对键及其对应的[^1]。 另一种常见的方式是借助于 EntrySet 进行遍历,在某些情况下可能更加灵活: ```java // 获取 entry set 的迭代器 Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<String, Integer> entry = iterator.next(); String key = entry.getKey(); Integer value = entry.getValue(); System.out.println(key + "=" + value); } ``` 此段代码同样实现了相同的功能——即输出所有的键对。 对于更早版本的 Java 或者其他特定需求,则可能会用到传统的 for 循环或者其他形式的方法来实现同样的目的[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值