runtime使用

需要用到的方法 <objc/runtime.h>
获取类的方法:Method class_getClassMethod(Class cls , SEL name)
获取类的实例对象方法:Method class_getInstanceMethod(Class cls , SEL name)
交换两个方法的实现:void method_exchangeImplementations(Method m1 , Method m2)
1、交换方法

// 获取两个类的类方法
Method m1 = class_getClassMethod([Person class], @selector(run));
Method m2 = class_getClassMethod([Person class], @selector(study));
// 开始交换方法实现
method_exchangeImplementations(m1, m2);
// 交换后,先打印学习,再打印跑!
[Person run];
[Person study];

2、获取Person类中所有成员变量的名字和类型

unsigned int outCount = 0;
Ivar *ivars = class_copyIvarList([Person class], &outCount);
 
// 遍历所有成员变量
for (int i = 0; i < outCount; i++) {
    // 取出i位置对应的成员变量
    Ivar ivar = ivars[i];
    const char *name = ivar_getName(ivar);
    const char *type = ivar_getTypeEncoding(ivar);
    NSLog(@"成员变量名:%s 成员变量类型:%s",name,type);
}
// 注意释放内存!
free(ivars);

3、利用runtime 获取所有属性来重写归档解档方法

// 设置不需要归解档的属性
- (NSArray *)ignoredNames {
    return @[@"_aaa",@"_bbb",@"_ccc"];
}
 
// 解档方法
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        // 获取所有成员变量
        unsigned int outCount = 0;
        Ivar *ivars = class_copyIvarList([self class], &outCount);
 
        for (int i = 0; i < outCount; i++) {
            Ivar ivar = ivars[i];
            // 将每个成员变量名转换为NSString对象类型
            NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];
 
            // 忽略不需要解档的属性
            if ([[self ignoredNames] containsObject:key]) {
                continue;
            }
 
            // 根据变量名解档取值,无论是什么类型
            id value = [aDecoder decodeObjectForKey:key];
            // 取出的值再设置给属性
            [self setValue:value forKey:key];
            // 这两步就相当于以前的 self.age = [aDecoder decodeObjectForKey:@"_age"];
        }
        free(ivars);
    }
    return self;
}
 
// 归档调用方法
- (void)encodeWithCoder:(NSCoder *)aCoder {
     // 获取所有成员变量
    unsigned int outCount = 0;
    Ivar *ivars = class_copyIvarList([self class], &outCount);
    for (int i = 0; i < outCount; i++) {
        Ivar ivar = ivars[i];
        // 将每个成员变量名转换为NSString对象类型
        NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];
 
        // 忽略不需要归档的属性
        if ([[self ignoredNames] containsObject:key]) {
            continue;
        }
 
        // 通过成员变量名,取出成员变量的值
        id value = [self valueForKeyPath:key];
        // 再将值归档
        [aCoder encodeObject:value forKey:key];
        // 这两步就相当于 [aCoder encodeObject:@(self.age) forKey:@"_age"];
    }
    free(ivars);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ONNX Runtime 是一种高性能、可移植的机器学习推理框架,旨在提供统一的API来支持多种模型格式,并在各种硬件平台上高效运行。它特别适合于在CPU、GPU甚至其他加速器上进行模型部署。 ### ONNX Runtime 支持 GPU 推理 ONNX Runtime 提供了对GPU的支持,通过充分利用CUDA技术,可以显著提升模型推理速度,特别是在处理大量数据或对性能有高要求的应用场景下。以下是ONNX Runtime如何利用GPU进行推理的一些关键点: 1. **模型加载**:首先需要将模型加载到ONNX Runtime中。对于GPU模型,这通常意味着模型本身已经被优化以便在GPU上运行。 2. **设备配置**:在创建ONNX Runtime会话时,你可以指定使用GPU作为计算资源。例如,在Python环境中,你可以通过设置`execution_providers=['CUDAExecutionProvider']`来指示ONNX Runtime优先使用GPU执行推理任务。 3. **内存管理**:ONNX Runtime会在GPU上分配必要的内存空间用于存储输入数据、中间结果以及最终输出。这包括预处理输入数据以适应模型的要求,以及处理从GPU返回的结果。 4. **并行化和优化**:通过使用GPU,ONNX Runtime能够并行处理大量的矩阵运算和其他数学操作,这对于深度学习模型中的卷积层、全连接层等具有很高的计算密集型特性来说尤为重要。 5. **性能监控**:为了提高效率,ONNX Runtime会自动调整和优化GPU的使用情况,比如动态调整线程数以匹配当前的任务负载,以及使用高级的并行算法来减少延迟时间和提高吞吐量。 6. **兼容性和灵活性**:ONNX Runtime设计的目的是跨平台,这意味着它可以很好地支持不同的GPU架构,如NVIDIA、AMD和Intel的最新GPU系列,并且随着新硬件的发展而持续更新优化策略。 ### 应用实例 假设你需要在基于ONNX的机器学习项目中使用GPU推理,步骤大致如下: ```python import onnxruntime as ort # 加载ONNX模型文件 model_path = 'path_to_your_model.onnx' session = ort.InferenceSession(model_path) # 获取可用的执行提供者,优先选择GPU providers = ['CUDAExecutionProvider', 'CPUExecutionProvider'] ort_session = ort.InferenceSession(model_path, providers=providers) ``` 在上述示例中,`CUDAExecutionProvider`表示我们希望ONNX Runtime尝试使用GPU来进行推理。如果GPU不可用,则会回退到CPU执行。 ### 相关问题: 1. 如何检查我的系统是否支持ONNX Runtime的GPU推理功能? 2. 在ONNX Runtime中调整GPU使用率的最佳实践是什么? 3. 如果遇到GPU性能瓶颈,应如何排查和优化ONNX Runtime的GPU使用效率?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值