runtime

runtime

runtime简单介绍

runtime是一套比较底层的纯C语言API, 属于1个C语言库, 包含了很多底层的C语言API。
在我们平时编写的OC代码中, 程序运行过程时, 其实最终都是转成了runtime的C语言代码, runtime算是OC的幕后工作者
比如说,下面一个创建对象的方法中,
举例:

OC : 
[[MJPerson alloc] init] 
runtime : 
objc_msgSend(objc_msgSend(“MJPerson” , “alloc”), “init”)
runtime作用

runtime 用来干什么呢??用在那些地方呢?怎么用呢?
runtime是属于OC的底层, 可以进行一些非常底层的操作(用OC是无法现实的, 不好实现)

在程序运行过程中, 动态创建一个类(比如KVO的底层实现)

在程序运行过程中, 动态地为某个类添加属性\方法, 修改属性值\方法

遍历一个类的所有成员变量(属性)\所有方法
例如:我们需要对一个类的属性进行归档解档的时候属性特别的多,这时候,我们就会写很多对应的代码,但是如果使用了runtime就可以动态设置!
例如,PYPerson.h的文件如下所示

import
@interface PYPerson : NSObject 
@property (nonatomic, assign) int age; 
@property (nonatomic, assign) int height; 
@property (nonatomic, copy) NSString *name; 
@property (nonatomic, assign) int age2; 
@property (nonatomic, assign) int height2; 
@property (nonatomic, assign) int age3; 
@property (nonatomic, assign) int height3; 
@property (nonatomic, assign) int age4; 
@property (nonatomic, assign) int height4;

@end

而PYPerson.m实现文件的内容如下

#import "PYPerson.h"
import
@implementation PYPerson

(void)encodeWithCoder:(NSCoder )encoder 
{ 
unsigned int count = 0; 
Ivar ivars = class_copyIvarList([PYPerson class], &count);

for (int i = 0; i<count; i++) {

// 取出i位置对应的成员变量
Ivar ivar = ivars[i];

// 查看成员变量
const char *name = ivar_getName(ivar);

// 归档
NSString *key = [NSString stringWithUTF8String:name];
id value = [self valueForKey:key];
[encoder encodeObject:value forKey:key];
}

free(ivars); 
}

(id)initWithCoder:(NSCoder *)decoder 
{ 
if (self = [super init]) {

unsigned int count = 0;
Ivar *ivars = class_copyIvarList([PYPerson class], &count);

for (int i = 0; i<count; i++) {
    // 取出i位置对应的成员变量
    Ivar ivar = ivars[i];

    // 查看成员变量
    const char *name = ivar_getName(ivar);

    // 归档
    NSString *key = [NSString stringWithUTF8String:name];
    id value = [decoder decodeObjectForKey:key];

    // 设置到成员变量身上
    [self setValue:value forKey:key];
}

free(ivars);
} 
return self; 
}

@end

这样我们可以看到归档和解档的案例其实是runtime写下的

学习runtime机制
1相关的头文件和函数
1> 头文件

利用头文件,我们可以查看到runtime中的各个方法!

2> 相关应用

NSCoding(归档和解档, 利用runtime遍历模型对象的所有属性)
字典 –> 模型 (利用runtime遍历模型对象的所有属性, 根据属性名从字典中取出对应的值, 设置到模型的属性上)
KVO(利用runtime动态产生一个类)
用于封装框架(想怎么改就怎么改)
这就是我们runtime机制的只要运用方向

3> 相关函数

objc_msgSend : 给对象发送消息
class_copyMethodList : 遍历某个类所有的方法
class_copyIvarList : 遍历某个类所有的成员变量
class_…..
这是我们学习runtime必须知道的函数!

4.必备常识
1> Ivar : 成员变量
2> Method : 成员方法

最近才开始往github上放东西 在公司写的又不能放= = 大家姑且看看吧

github地址: https://github.com/FuThD

### 安装方法 ONNX Runtime 的安装可以通过 Python 的包管理工具 `pip` 进行。用户可以直接使用以下命令来安装最新版本的 ONNX Runtime: ```bash pip install onnxruntime ``` 如果需要特定版本的 ONNX Runtime,例如版本 1.16.0,则可以使用以下命令指定版本号进行安装: ```bash pip install onnxruntime==1.16.0 ``` 对于某些高级用例或开发需求,可能还需要从源码构建 ONNX Runtime,但这通常适用于有特殊定制需求的开发者[^1]。 ### 使用指南 安装完成后,可以通过 Python 导入 `onnxruntime` 模块来加载并运行 ONNX 模型。以下是一个简单的示例,展示如何使用 ONNX Runtime 加载模型并执行推理: ```python import onnxruntime as ort import numpy as np # 加载模型 session = ort.InferenceSession("path_to_model.onnx") # 准备输入数据 input_name = session.get_inputs()[0].name input_data = np.random.rand(1, 3, 224, 224).astype(np.float32) # 执行推理 outputs = session.run(None, {input_name: input_data}) # 输出结果 print(outputs) ``` 为了确保安装的 ONNX Runtime 性能满足预期,可以运行一些基准测试。这些测试将帮助了解模型在特定硬件上的性能。可以使用 ONNX 模型测试基准工具,或使用自定义脚本来测量推理时间和其他性能指标。例如,使用内置的基准工具: ```bash python3 -m onnxruntime.tools.benchmark --input path_to_model.onnx --input_feed input_name(input_data) --iter 10 ``` 这个命令会执行 10 次推理迭代,并报告平均推理时间等性能指标[^1]。 ### 调试技巧 ONNX Runtime 提供了强大的日志系统,这对于调试模型推理过程中的问题非常有用。通过合理配置日志级别和输出方式,开发者可以更高效地诊断模型推理过程中的各种问题。可以通过设置环境变量来控制日志级别,例如: ```bash ORT_LOG_LEVEL=VERBOSE ``` 此外,还可以通过编程方式配置日志记录器,以便于捕获和分析运行时的日志信息。这有助于快速定位和解决潜在的问题[^2]。 当遇到模型兼容性问题时,比如导出模型时报错 `Unsupported: ATen operator triu`,一种解决方案是替换为等效的 ONNX 算子。具体做法如下: ```python # 修改前 torch.triu(...) # 修改后 torch.onnx.symbolic_opset9.triu = lambda g, input: g.op("Trilu", input, upper=1) ``` 这种修改允许用户在导出模型时绕过 PyTorch 中不支持的操作,从而实现与 ONNX 的兼容[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值