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

制作礼品袋图片/网络seo排名

制作礼品袋图片,网络seo排名,西宁市企业建站专业,申报湖南创新型省份建设专项网站前言 在iOS开发中,对日期进行格式化处理通常有三个步骤: 创建DateFormatter对象设置日期格式使用DateFormatter对象对日期进行处理在上篇文章《DateFormatter性能优化》中,我们通过创建单例对象的方式对创建DateFormatter对象,设置…

前言

在iOS开发中,对日期进行格式化处理通常有三个步骤:

  • 创建DateFormatter对象
  • 设置日期格式
  • 使用DateFormatter对象对日期进行处理

在上篇文章《DateFormatter性能优化》中,我们通过创建单例对象的方式对创建DateFormatter对象,设置日期格式两个步骤进行了缓存,将方法耗时降低为不缓存的方案的10%左右,但是这种优化方法受制于DateFormatter的几个系统方法的执行效率,本身具有一定的局限性。之前在一些文章中,也看到了使用C语言的

size_t	 strftime_l(char * __restrict, size_t, const char * __restrict,const struct tm * __restrict, locale_t)__DARWIN_ALIAS(strftime_l) __strftimelike(3);
复制代码

函数对日期格式化进行处理,所以本文将对以下几种情况的方法耗时进行评测:

  • 使用Objective-C,不缓存DateFormatter对象
  • 使用Objective-C,缓存DateFormatter对象
  • 使用Objective-C,调用strftime_l做日期处理
  • 使用Swift,不缓存DateFormatter对象
  • 使用Swift,缓存DateFormatter对象
  • 使用Swift,调用strftime_l做日期处理

Objective-C的三种情况下的代码


//不缓存DateFormatter对象
-(void)testDateFormatterInOCWithoutCache:(NSInteger)times {NSString *string = @"";NSDate *date;CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent();for (int i=0; i<times; i++) {NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];[dateFormatter setDateFormat:@"yyyy年MM月dd日HH时mm分ss秒"];date = [NSDate dateWithTimeIntervalSince1970:(1545308405 + i)];string = [dateFormatter stringFromDate:date];}CFAbsoluteTime duration = (CFAbsoluteTimeGetCurrent() - startTime) * 1000.0;NSLog(@"\n不缓存DateFormatter对象的方案:\n计算%ld次\n耗时%f ms\n", (long)times, duration);
}//缓存DateFormatter对象
-(void)testDateFormatterInOCWithCache:(NSInteger)times {NSString *string = @"";NSDate *date;CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent();for (int i=0; i<times; i++) {date = [NSDate dateWithTimeIntervalSince1970:(1545308405 + i)];string = [[DateFormatterCache shareInstance].formatterOne stringFromDate:date];}CFAbsoluteTime duration = (CFAbsoluteTimeGetCurrent() - startTime) * 1000.0;NSLog(@"\n缓存DateFormatter对象的方案:\n计算%ld次\n耗时%f ms\n", (long)times, duration);
}//使用C语言来做日期处理
-(void)testDateFormatterInC:(NSInteger)times {NSString *string = @"";NSDate *date;time_t timeInterval;char buffer[80];CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent();for (int i=0; i<times; i++) {date = [NSDate dateWithTimeIntervalSince1970:(1545308405 + i)];timeInterval = [date timeIntervalSince1970];strftime(buffer, sizeof(buffer), "%Y年%m月%d日%H时%M分%S秒", localtime(&timeInterval));string = [NSString stringWithCString:buffer encoding:NSUTF8StringEncoding];}CFAbsoluteTime duration = (CFAbsoluteTimeGetCurrent() - startTime) * 1000.0;NSLog(@"==%@", string);NSLog(@"\n使用C语言的方案:\n计算%ld次\n耗时%f ms\n", (long)times, duration);
}复制代码

这里对于咱们iOS开发的同学来说比较陌生的就是 strftime_l(buffer, sizeof(buffer), "%Y年%m月%d日%H时%M分%S秒", localtime(&timeInterval), NULL);这这行代码的调用,strftime_l函数接受四个参数,第一个参数buffer是C语言中字符数组用于存储日期格式化后的字符串,第二个参数是写入buffer数组的最大值,如果格式化的字符串大于这个值,那么只会取字符串的的一部分,第三个参数"%Y年%m月%d日%H时%M分%S秒"是日期格式,第四个参数localtime(&timeInterval)是指向使用当地时区对时间戳处理得到tm类型结构体的指针

附上tm结构体:

struct tm {int	tm_sec;		/* seconds after the minute [0-60] */int	tm_min;		/* minutes after the hour [0-59] */int	tm_hour;	/* hours since midnight [0-23] */int	tm_mday;	/* day of the month [1-31] */int	tm_mon;		/* months since January [0-11] */int	tm_year;	/* years since 1900 */int	tm_wday;	/* days since Sunday [0-6] */int	tm_yday;	/* days since January 1 [0-365] */int	tm_isdst;	/* Daylight Savings Time flag */long	tm_gmtoff;	/* offset from UTC in seconds */char	*tm_zone;	/* timezone abbreviation */
};
复制代码

Swift三种情况下的代码

    //不进行缓存func testInOldWay(_ times: Int) {var string = ""var date = Date.init()let startTime = CFAbsoluteTimeGetCurrent();for i in 0..<times {let formatter = DateFormatter()formatter.dateFormat = "yyyy年MM月dd日HH时mm分ss秒"date = Date.init(timeIntervalSince1970: TimeInterval(1545308405 + i))string = formatter.string(from: date)}let duration = (CFAbsoluteTimeGetCurrent() - startTime) * 1000.0;print("使用oldWay计算\n\(times)次,总耗时\n\(duration) ms\n")}//进行缓存func testInNewWay(_ times: Int) {var string = ""var date = Date.init()let startTime = CFAbsoluteTimeGetCurrent();for i in 0..<times {date = Date.init(timeIntervalSince1970: TimeInterval(1545308405 + i))string = DateFormatterCache.shared.dateFormatterOne.string(from: date)}let duration = (CFAbsoluteTimeGetCurrent() - startTime) * 1000.0;print("使用缓存Formatter的方案计算\n\(times)次,总耗时\n\(duration) ms\n")}//使用C语言来做日期处理func testFormatterInC(_ times: Int) {var date = Date.init()var dateString = ""var buffer = [Int8](repeating: 0, count: 100)var time = time_t(date.timeIntervalSince1970)let format = "%Y年%m月%d日%H时%M分%S秒"let startTime = CFAbsoluteTimeGetCurrent();for i in 0..<times {date = Date.init(timeIntervalSince1970: TimeInterval(1545308405 + i))time = time_t(date.timeIntervalSince1970)strftime(&buffer, buffer.count, format, localtime(&time))dateString = String.init(cString: buffer, encoding: String.Encoding.utf8) ?? ""}let duration = (CFAbsoluteTimeGetCurrent() - startTime) * 1000.0;print("使用C语言的方案计算\n\(times)次,总耗时\n\(duration) ms\n")print(dateString)}
复制代码

iOS 12.1 iPhone 7

测试结果:

测试结果:

在Objective-C中, 不使用缓存,使用缓存,使用C语言函数处理的耗时比约为100:10.7:3.5

在Swift中, 不使用缓存,使用缓存,使用C语言函数处理的耗时比约为100:11.7:6.6

Swift在使用DateFormatter进行处理时,不论是缓存的方案还是不缓存的方案,跟使用Objective-C的耗时基本一致,而在Swift中使用C语言的函数来做日期处理时,时间约为使用Objective-C的两倍,而且当只做一次日期处理时,由于涉及到一些初始资源的初始化,所以看上去比后面执行10次的时间还多

最后

如果项目是Objective-C的项目,我觉得可以采用这种C语言的strftime来做日期处理,能将时间降低为缓存NSDateFormatter的方案的33%左右,如果是Swift项目,调用C语言函数的效率没有在Objective-C项目中那么高,虽然能将时间降低为缓存NSDateFormatter的方案的56%左右,但是在Swift中使用C语言的函数存在一定的风险,在这里风险之一就是time = time_t(date.timeIntervalSince1970)这行代码返回的值是time_t类型,time_t类型的定义如下:

public typealias time_t = __darwin_time_t
public typealias __darwin_time_t = Int /* time() */
复制代码

time_t其实就是Int,当Swift项目运行在32位设备(也就是iphone 5,iphone 5C)上时,Int类型是32位的,最大值为2147483647,如果这是一个时间戳的值,转换为正常时间是2038-01-19 11:14:07,也就是处理的时间是未来的日期,2038年以后的话,会出现数值溢出。

Demo在这里: github.com/577528249/S…

参考资料:

forums.developer.apple.com/thread/2905… stackoverflow.com/questions/2…

PS:

最近加了一些iOS开发相关的QQ群和微信群,但是感觉都比较水,里面对于技术的讨论比较少,所以自己建了一个iOS开发进阶讨论群,欢迎对技术有热情的同学扫码加入,加入以后你可以得到:

1.技术方案的讨论,会有在大厂工作的高级开发工程师尽可能抽出时间给大家解答问题

2.每周定期会写一些文章,并且转发到群里,大家一起讨论,也鼓励加入的同学积极得写技术文章,提升自己的技术

3.如果有想进大厂的同学,里面的高级开发工程师也可以给大家内推,并且针对性得给出一些面试建议

群已经满100人了,想要加群的小伙伴们可以扫码加这个微信,备注:“加群+昵称”,拉你进群,谢谢了

http://www.lbrq.cn/news/1093519.html

相关文章:

  • 长沙 网站设计 公司/深圳企业网站制作
  • wordpress 评论次数/seo优化外包
  • 建设销售型网站/北京口碑最好的教育机构
  • 公司需要做网站吗/seo优化排名是什么
  • 怎样快速仿做网站/网站开发与设计
  • 培训机构网站建设/免费推广的预期效果
  • 招商建设工程有限公司网站/营销型网页设计
  • 湖南怀化疫情最新消息/seo推广话术
  • h5网站怎么做的吗/婚恋网站排名前三
  • 南京网站建设与维护/各大免费推广网站
  • 做百度推广一定要有自已网站/全国广告投放平台
  • 北京专业网站改版/人力资源培训网
  • ui做自适应网站/友情链接交易平台
  • 手机建网站步骤软件/深圳seo技术
  • 在线教育网站建设/深圳seo推广公司
  • 免费网站自动优化软件/接外包项目的网站
  • 做海报的话网站/域名交易平台
  • joomla 网站建设/最新国内新闻重大事件
  • 成都微信网站建设多/设计公司排名前十强
  • 如何提高商城网站权重/在线crm
  • 买高端品牌网站建设/今日新闻最新头条10条摘抄
  • 网站开发 先做前端吗/中国企业网络营销现状
  • 做阀门的英文网站怎么写/手机打开国外网站app
  • php7安装wordpress/广州seo网站管理
  • 网站开发项目风险/今日头条荆州新闻
  • 济南专业制作网站/搜索引擎优化的办法有哪些
  • 在重庆 那里可以做诚信网站认证/优化是什么梗
  • 网站建设规范布局/武汉seo排名扣费
  • 包头怎样做网站/加盟教育培训机构
  • 做茶网站/黄山seo公司
  • 数据库索引详解:原理、设计原则与应用场景
  • 在python3.8和pytorch1.8.1的基础上安装tensorflow
  • 力扣刷题(第九十九天)
  • “磁”力全开:钕铁硼重塑现代科技生活
  • JVM原理及其机制(二)
  • Mac电脑开发Python(基于vs code)