是否有一种方法/软件可以提供执行用Swift编写的代码块所需的精确时间,除了以下内容?
let date_start = NSDate()
// Code to be executed
println("\(-date_start.timeIntervalSinceNow)")
Run Code Online (Sandbox Code Playgroud) 像许多其他开发人员一样,我对Apple的新Swift语言感到非常兴奋.Apple声称它的速度比Objective C快,可以用来编写操作系统.从我到目前为止所学到的,它是一种静态类型语言,能够精确控制确切的数据类型(如整数长度).所以它看起来像具有良好的潜在处理性能关键任务,如图像处理,对吧?
在我进行快速测试之前,这就是我的想法.结果真的让我感到惊讶.
这是C中的一个简单代码片段:
test.c的:
#include <stdio.h>
#include <stdint.h>
#include <string.h>
uint8_t pixels[640*480];
uint8_t alpha[640*480];
uint8_t blended[640*480];
void blend(uint8_t* px, uint8_t* al, uint8_t* result, int size)
{
for(int i=0; i<size; i++) {
result[i] = (uint8_t)(((uint16_t)px[i]) *al[i] /255);
}
}
int main(void)
{
memset(pixels, 128, 640*480);
memset(alpha, 128, 640*480);
memset(blended, 255, 640*480);
// Test 10 frames
for(int i=0; i<10; i++) {
blend(pixels, alpha, blended, 640*480);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我使用以下命令在Macbook Air 2011上编译它:
clang -O3 test.c -o test
Run Code Online (Sandbox Code Playgroud)
10帧处理时间约为0.01秒.换句话说,它需要C代码1ms来处理一帧:
$ time ./test …Run Code Online (Sandbox Code Playgroud) 当我正在玩一个快速的教程时,我开始编写一个自定义isPrime方法来检查给定Int是否为素数.
在写完之后,我意识到它工作正常,但发现它isPrime在某些相当大的数字上执行有点慢(当时仍然低得多Int.max).
所以我在objc中编写了相同的代码片段,代码执行得更快(66倍).
这是快速代码:
class Swift {
class func isPrime(n:Int) -> Bool {
let sqr : Int = Int(sqrt(Double(n))) + 1
for i in 2...sqr {
if n % i == 0 {
return false
}
}
return true;
}
class func primesInRange(start:Int, end:Int) -> Int[] {
var primes:Int[] = Int[]()
for n in start...end {
if self.isPrime(n) {
primes.append(n)
}
}
return primes;
}
}
Run Code Online (Sandbox Code Playgroud)
和objc代码:
@implementation Utils
+ …Run Code Online (Sandbox Code Playgroud) 我有一个长字符串(有时超过1000个字符),我想转换为布尔值数组.它需要很快完成这么多次.
let input: String = "001"
let output: [Bool] = [false, false, true]
Run Code Online (Sandbox Code Playgroud)
我天真的尝试是这样的:
input.characters.map { $0 == "1" }
Run Code Online (Sandbox Code Playgroud)
但这比我想要的要慢很多.我的分析告诉我,这map是减速的地方,但我不确定我能做多少简单.
如果没有Swift/ObjC的开销,我觉得这会很快.在C中,我认为这是一个简单的for循环,其中一个字节的内存与一个常量进行比较,但我不确定我应该看到的函数或语法是什么.
有没有办法更快地做到这一点?
更新:
我也试过了
output = []
for char in input.characters {
output.append(char == "1")
}
Run Code Online (Sandbox Code Playgroud)
它的速度提高了约15%.我希望远不止这些.
有没有快速的方法来评估在新的XCode 6游乐场中编写的某个代码部分的性能/运行时间?
我想通过比较某些解决方案的不同编码样式及其对代码性能的影响来开始学习Swift.
假设我有一个字典数组:
[ { "id": 2 }, { "id": 59 }, { "id": 31 } ... ]
Run Code Online (Sandbox Code Playgroud)
我怎样才能对它进行排序,使其按降序排列,按"id"排序?
我最初的方法是这样的:
Loop through each element, find the biggest one, and put it into a new array. Then, remove that from the element. Repeat.
Run Code Online (Sandbox Code Playgroud)
但我知道这是错误的,效率不高.
我试图排序尺寸亿的阵列中的Swift和Kotlin,我可以看到它们之间的巨大的性能差距.对于这个数字,Kotlin几乎18快Swift(在我的机器上).
我记录了一些结果,我发现当尺寸大约为10000或更小时swift更快但是一旦数量增加,Swift与之相比变得非常慢Kotlin.
Swift和Kotlin的代码如下,
迅速
let n = 100000000
var arr = Array(repeating: 0, count: n)
for i in 1...n {
arr[i-1] = Int(arc4random_uniform(UInt32(n)))
}
//Record time before sort
arr.sort()
//Record time after sort
Run Code Online (Sandbox Code Playgroud)
科特林
val n = 100000000
val arr = IntArray(n)
for (i in 1..n) {
arr[i-1] = Random().nextInt(n)
}
//Record time before sort
arr.sort()
//Record time after sort
Run Code Online (Sandbox Code Playgroud)
两者记录的时间如下,
迅速
Size: 1000 Time: 0.001 …Run Code Online (Sandbox Code Playgroud)