Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift RC4与Objective-C RC4性能对比_Objective C_Swift_Performance_Encryption_Microbenchmark - Fatal编程技术网

Swift RC4与Objective-C RC4性能对比

Swift RC4与Objective-C RC4性能对比,objective-c,swift,performance,encryption,microbenchmark,Objective C,Swift,Performance,Encryption,Microbenchmark,我一直在尝试将一个Rc4算法从objective-c重写为swift,以测试Apple(现在已经过时)的说法,关于它的运行速度要快得多。 然而,一定有什么地方,我在做一些可怕的错误与这些时间,我得到 这是目标c代码: +(NSString*)Rc4:(NSString*)aInput key:(NSString *)aKey { NSMutableArray *iS = [[NSMutableArray alloc] initWithCapacity:256]; NSMutabl

我一直在尝试将一个Rc4算法从objective-c重写为swift,以测试Apple(现在已经过时)的说法,关于它的运行速度要快得多。 然而,一定有什么地方,我在做一些可怕的错误与这些时间,我得到

这是目标c代码:

+(NSString*)Rc4:(NSString*)aInput key:(NSString *)aKey {
    NSMutableArray *iS = [[NSMutableArray alloc] initWithCapacity:256];
    NSMutableArray *iK = [[NSMutableArray alloc] initWithCapacity:256];

    for (int i = 0; i <256;i++){
        [iS addObject:[NSNumber numberWithInt:i]];
    }

    for(short i=0;i<256;i++){
        UniChar c = [aKey characterAtIndex:i%aKey.length];
        [iK addObject:[NSNumber numberWithChar:c]];
    }
    int j=2;
    for (int i=0; i<255;i++){
        int is = [[iS objectAtIndex:i]  intValue];
        UniChar ik = (UniChar)[[iK objectAtIndex:i]charValue];

        j= (j+is+ik)%256;
        NSNumber *temp = [iS objectAtIndex:i];
        [iS replaceObjectAtIndex:i withObject:[iS objectAtIndex:j]];
        [iS replaceObjectAtIndex:j withObject:temp];
    }

    int i =0;
    j=0;
    NSString *result = aInput;

    for (short x=0;x<[aInput length]; x++){
        i = (i+1)%256;

        int is = [[iS objectAtIndex:i]intValue];
        j=(j+is)%256;

        int is_i = [[iS objectAtIndex:i]intValue];
        int is_j = [[iS objectAtIndex:j]intValue];

        int t= (is_i+is_j)%256;
        int iY = [[iS objectAtIndex:t]intValue];

        UniChar ch = (UniChar)[aInput characterAtIndex:x];
        UniChar ch_y=ch^iY;
        //NSLog(ch);
        //NSLog(iY);

        result = [result stringByReplacingCharactersInRange:NSMakeRange(x,1) withString:
                  [NSString stringWithCharacters:&ch_y length:1] ];
    }
    [iS release];
    [iK release];
    return result;
}

Swift.Swift是我的文件,Swift是我的可执行文件

通常关于速度的说法并不真正适用于加密算法,它们更多的是我通常所说的“业务逻辑”。位、字节、16/32/64位字等的函数通常难以优化。基本上,加密算法设计为对这些数据结构进行密集操作,可以优化的选项相对较少

以Java为例。尽管它的速度比大多数解释语言快得多,但与C/C++相比,它确实不太好,更不用说汇编优化的加密算法了。大多数相对较小的代数问题也是如此


为了让事情变得更快,你至少应该使用你的数字。

在对代码进行了过度测试之后,我把它缩小到了让我的时间过得非常慢的程度。 如果我注释掉这段代码,使iK数组只包含其初始值。我从5秒的运行时间变为1秒。这是一个显著的增长

for var i = 0; i < 256 ; i++ {
var c = key[i%keyLength]
iK[i] = c;  
}
Swift中没有“characterAtIndex(int)”方法,因此我将此作为获取characterAtIndex的一种解决方法。我用我的分机来做:

extension String {
  subscript (i: Int) -> String {
    return String(Array(self)[i])
  }
}
但本质上与此相同:

var c = Array(key)[i%keyLength]

在objective-c中,我们得到的运行时间不是O(1)-(恒定时间),而是O(n)

您的Swift代码不是在Xcode 6.1中生成的。在实际加密部分,在这两种情况下都不要使用字符串。加密是一种数据操作。将您的结果与普通加密进行比较,您会发现这两种实现都不太接近。这里的目的是在objective-c和swift中测试非常相似的代码片段,我以为我正在这样做,但这些奇怪的运行时正在反对它。这不是优化加密的安全性,甚至不是正确地进行加密。感谢您的输入,如果它看起来很奇怪,请道歉。Swift中的字符串可能非常慢,因为由于更好的unicode处理,没有直接索引到它们。添加到字符串中的扩展不是一个好主意,它们不能用于需要多个UTF-16代码单元(如表情符号)的unicode字符,这就是为什么它们不是Swift的一部分。由于扩展不适用于所有字符串,所以只需将方法设置为私有。另外还要检查Swift编译优化级别。据我所知,我实际上一直在寻找有关编译优化级别()的文档-O(Swift)类似于-O3(objective-c),但我还没有找到任何严格的文档来支持这一点。再次感谢!当然,这确实是“业务逻辑”。我正在尝试一些基准测试,因为苹果声称Rc4加密的速度比objective-c(python对我来说没那么有趣)有显著提高。本文提到了关于wwdc()基准测试的内容,键不应该是字符串。所以我不认为苹果会为此烦恼。我认为仍然有很多优化的可能性,但由于苹果再次创建了自己的封闭开发环境,我无法进行测试。@Christian一般来说,unicode不可直接索引,因为有些字符可以由多个代码单元组成,无论是UTF-8、UTF-16还是UTF-32编码。美国国旗符号
var c = key[i%keyLength]
extension String {
  subscript (i: Int) -> String {
    return String(Array(self)[i])
  }
}
var c = Array(key)[i%keyLength]