当前位置: 首页 > news >正文

C语言实现基于高效率IP路由查找的内容

基于高效率 IP 路由查找的内容

实验内容

实验内容一

实现最基本的前缀树查找

实验内容二

调研并实现某种 IP 前缀查找方案

测试与验证

  • 基于 forwarding-table.txt 数据集(Network, Prefix Length, Port)

  • 本实验只考虑静态数据集,不考虑表的添加或更新

  • 以前缀树查找结果为基准,检查所实现的 IP 前缀查找是否正确

    • 可以将 forwarding-table.txt 中的 IP 地址作为查找的输入
  • 对比基本前缀树和所实现 IP 前缀查找的性能

    • 内存开销、平均单次查找时间

设计思路

最基本的前缀树查找

RouterEntry* line_parser (char * line) 函数

负责将 txt 文件中读取的每一行字符串,转换成路由表项,返回 RouterEntry*,每一个路由表项结构包括三个变量,分别是网络号,掩码长度以及转发端口号。

int net_parser(char * s) 函数

负责将网络号从字符串类型,转换成一个 int 类型。

TreeNode * init_tree() 函数

初始化树结构,即建立一个树的根节点,并返回根节点。

int add_node (RouterEntry* entry) 函数

结果验证

基本前缀树实验结果

实验结果如下:

在这里插入图片描述

上图可知,实现基本前缀树所消耗的内存为 65863400 字节。所需要的查找时间(除去从 txt 中解析字符串的时间)为 118ns。

Leaf Pushing 实验结果

实验结果如下:

在这里插入图片描述

上图可知,实现基本前缀树所消耗的内存为 39518040 字节。所需要的查找时间(除去从 txt 中解析字符串的时间)为 117ns。

两者对比发现 Leaf Pushing 在存在很多路由表项插入的情况下,内存消耗减少 40%。但是时间减小的并不明显。这是因为存在很多路由表项来构建前缀树时,前缀树趋于完全,因此可以减少查询的次数不多。相较于通过算法进行改进,通过编译优化进行速度提升效果更高。

Leaf Pushing 开启 O2 编译优化的的结果如下:

在这里插入图片描述

可以看到此时通过对控制流和指令排布调度等方面的优化,查找的处理速度提高了一个数量级。

相关文章:

  • 南大通用GBase8s 常用SQL语句(263)
  • Bootstrap Table 实现 分页选中
  • 嵌入式系统开发笔记89:认识AVR微控制器系统架构
  • GeoPandas安装
  • View-of-Delft数据集文件学习
  • 西门子PLC S7-1200如何实现远程上下载?
  • MySQL的SQL基础(五)
  • 图书巨头BakerTaylor遭勒索软件攻击 系统中断一周仍未恢复
  • 项目实战第三十六讲:基于 Sharding-JDBC 的商品分库⽅案
  • MySQL(进阶篇--InnoDB引擎)
  • 【Linux修炼】开篇
  • 【数学建模】层次分析(MatlabPython代码实现)
  • 如何用人工智能自动玩游戏
  • PIE-engine 教程 ——影像集合的使用for循环函数(北京市NDVI计算)
  • 数据结构-栈和队列(1)
  • [nginx文档翻译系列] 控制nginx
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • E-HPC支持多队列管理和自动伸缩
  • ES6 ...操作符
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • js作用域和this的理解
  • Mithril.js 入门介绍
  • php ci框架整合银盛支付
  • quasar-framework cnodejs社区
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 闭包--闭包作用之保存(一)
  • 服务器从安装到部署全过程(二)
  • 容器服务kubernetes弹性伸缩高级用法
  • 少走弯路,给Java 1~5 年程序员的建议
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 数组的操作
  • 推荐一个React的管理后台框架
  • FaaS 的简单实践
  • puppet连载22:define用法
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • # include “ “ 和 # include < >两者的区别
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (回溯) LeetCode 46. 全排列
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • .NET HttpWebRequest、WebClient、HttpClient
  • .Net mvc总结
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • @ConditionalOnProperty注解使用说明