我用这两种数据结构和这两种不同的语言做了一些性能测试。 结果不是我所期望的。我认为obj-c程序会比java更快。我的测试说,Java的TreeMap比可可NSDictionary更快。 用于测试的代码是:
OBJ-C的NSDictionary:NSDictionary(obj-c)和HashMap(java)之间性能的差异
#import <Foundation/Foundation.h>
NSString * getRandomString();
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSMutableDictionary * dict = [NSMutableDictionary dictionary];
unsigned long i;
NSString * string1;
NSString * string2;
NSString * string3;
NSString * lastString;
//dictionary with 100'000 elements
srand(time(NULL));
for (i=0;i<100000;i++){
NSString * aString = getRandomString();
[dict setObject:aString forKey:aString];
if (i == 100)
string1 = aString;
if (i == 1000)
string2 = aString;
if (i == 10000)
string3 = aString;
if (i == 100000-1)
lastString = aString;
}
NSDate * now;
now = [NSDate date];
[dict objectForKey:string1];
NSTimeInterval interval = [now timeIntervalSinceNow];
NSLog(@"%f",interval *-1000);
now = [NSDate date];
[dict objectForKey:string2];
interval = [now timeIntervalSinceNow];
NSLog(@"%f",interval *-1000);
now = [NSDate date];
[dict objectForKey:string3];
interval = [now timeIntervalSinceNow];
NSLog(@"%f",interval *-1000);
now = [NSDate date];
[dict objectForKey:lastString];
interval = [now timeIntervalSinceNow];
NSLog(@"%f",interval *-1000);
[pool drain];
return 0;
}
NSString * getRandomString(){
NSString * tmp = [NSString string];
for (int i = 0 ; i < 10;i++){
tmp = [NSString stringWithFormat:@"%@%c",tmp,rand()%128];
}
return tmp;
}
命令行输出是这样的:
2011-07-12 13:11:48.299 TestBench[1178:a0f] 0.008047
2011-07-12 13:11:48.302 TestBench[1178:a0f] 0.005007
2011-07-12 13:11:48.302 TestBench[1178:a0f] 0.003040
2011-07-12 13:11:48.303 TestBench[1178:a0f] 0.003994
爪哇TreeSet中:
import java.util.Date;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
String string1="",string2="",string3="",lastString="";
TreeMap<String,String> map = new TreeMap<String,String>();
for (long i=0;i<100000;i++){
String aString = getRandomString();
map.put(aString, aString);
if (i == 100)
string1 = aString;
if (i == 1000)
string2 = aString;
if (i == 10000)
string3 = aString;
if (i == 100000-1)
lastString = aString;
}
Date start,end;
start = new Date();
map.get(string1);
end = new Date();
System.out.println(end.getTime()-start.getTime());
start = new Date();
map.get(string2);
end = new Date();
System.out.println(end.getTime()-start.getTime());
start = new Date();
map.get(string3);
end = new Date();
System.out.println(end.getTime()-start.getTime());
start = new Date();
map.get(lastString);
end = new Date();
System.out.println(end.getTime()-start.getTime());
}
public static String getRandomString(){
String toRet = "";
for (int i=0;i<10;i++){
toRet+=(char)(Math.random()*128);
}
return toRet;
}
}
和命令行输出是这样的:
0
0
0
0
明显以毫秒为单位,与obj-c一样。 为什么TreeMap速度如此之快?或...为什么NSDictionary如此缓慢? 任何人都可以解释给我? 对不起,我的英语很差 非常感谢。
**ADDING QUESTION* ** * **** 我作出修改,以这样的代码:
OBJ-C
#import <Foundation/Foundation.h>
NSString * getRandomString();
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSMutableDictionary * dict = [NSMutableDictionary dictionary];
long int i;
NSString * string1;
NSString * string2;
NSString * string3;
NSString * lastString;
//dictionary with 100'000 elements
srand(time(NULL));
double sum = 0;
for (int j = 0 ;j<10;j++){
NSDate * now;
now = [NSDate date];
for (i=0;i<100000;i++){
NSString * aString = getRandomString();
[dict setObject:aString forKey:aString];
if (i == 100)
string1 = aString;
if (i == 1000)
string2 = aString;
if (i == 10000)
string3 = aString;
if (i == 100000-1)
lastString = aString;
}
NSLog(@"Finished adding elements in %f ms",[now timeIntervalSinceNow]*-1000);
now = [NSDate date];
for (int i = 0;i<1000000;i++)
[dict objectForKey:string1];
for (int i = 0;i<1000000;i++)
[dict objectForKey:string2];
for (int i = 0;i<1000000;i++)
[dict objectForKey:string3];
for (int i = 0;i<1000000;i++)
[dict objectForKey:lastString];
NSTimeInterval interval = [now timeIntervalSinceNow];
sum+=interval;
}
NSLog(@"medium lookup time: %f ms",sum/10/4*-1000);
[pool drain];
return 0;
}
NSString * getRandomString(){
NSString * tmp = [NSString string];
for (int i = 0 ; i < 10;i++){
tmp = [NSString stringWithFormat:@"%@%c",tmp,rand()%128];
}
return tmp;
}
的输出:
2011-07-12 14:48:36.519 TestBench[974:a0f] Finished adding elements in 1950.287998 ms
2011-07-12 14:48:38.722 TestBench[974:a0f] Finished adding elements in 1899.537027 ms
2011-07-12 14:48:41.340 TestBench[974:a0f] Finished adding elements in 1939.461946 ms
2011-07-12 14:48:43.681 TestBench[974:a0f] Finished adding elements in 1991.870999 ms
2011-07-12 14:48:45.854 TestBench[974:a0f] Finished adding elements in 1857.455015 ms
2011-07-12 14:48:48.636 TestBench[974:a0f] Finished adding elements in 2205.457032 ms
2011-07-12 14:48:50.782 TestBench[974:a0f] Finished adding elements in 1866.232991 ms
2011-07-12 14:48:53.106 TestBench[974:a0f] Finished adding elements in 1847.414017 ms
2011-07-12 14:48:55.537 TestBench[974:a0f] Finished adding elements in 1982.506990 ms
2011-07-12 14:49:00.629 TestBench[974:a0f] Finished adding elements in 4536.152005 ms
2011-07-12 14:49:00.962 TestBench[974:a0f] medium lookup time: 107.704024 ms
的Java
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
String string1="",string2="",string3="",lastString="";
Map<String,String> map = new HashMap<String,String>();
long sum=0;
for (int j=0;j<10;j++){
Date start,end;
start = new Date();
for (long i=0;i<100000;i++){
String aString = getRandomString();
map.put(aString, aString);
if (i == 100)
string1 = aString;
if (i == 1000)
string2 = aString;
if (i == 10000)
string3 = aString;
if (i == 100000-1)
lastString = aString;
}
end = new Date();
System.out.println("Finished adding elements in "+(end.getTime()-start.getTime())+" ms");
start = new Date();
for (int i = 0;i<1000000;i++)
map.get(string1);
for (int i = 0;i<1000000;i++)
map.get(string2);
for (int i = 0;i<1000000;i++)
map.get(string3);
for (int i = 0;i<1000000;i++)
map.get(lastString);
end = new Date();
sum+=end.getTime()-start.getTime();
}
System.out.println("medium lookup time: "+sum/10/4+" ms");
}
public static String getRandomString(){
String toRet = "";
for (int i=0;i<10;i++){
toRet+=(char)(Math.random()*128);
}
return toRet;
}
}
结果为HashMap的:
Finished adding elements in 314 ms
Finished adding elements in 275 ms
Finished adding elements in 263 ms
Finished adding elements in 285 ms
Finished adding elements in 309 ms
Finished adding elements in 284 ms
Finished adding elements in 270 ms
Finished adding elements in 395 ms
Finished adding elements in 320 ms
Finished adding elements in 1804 ms
medium lookup time: 8 ms
结果的树图
Finished adding elements in 400 ms
Finished adding elements in 430 ms
Finished adding elements in 474 ms
Finished adding elements in 581 ms
Finished adding elements in 562 ms
Finished adding elements in 599 ms
Finished adding elements in 654 ms
Finished adding elements in 625 ms
Finished adding elements in 638 ms
Finished adding elements in 1750 ms
medium lookup time: 194 ms
因此,我认为NSDictionary中没有与散列函数但一棵树。 为什么需要这么多时间在NSDictionary中添加元素? 是否有可可与Java hashset相似的性能的地图? 谢谢
map.get()大概北京时间太快以毫秒为单位来测量。尝试调用map.get()100万次或100万次,看看它如何表现。 – Matt
您的“添加”基准大部分时间花费在创建随机字符串上。如果您不在时间范围内,速度要快10倍。看到我更新的答案。 –
另请注意,与8 ms相比,我的平均查找时间为HashMap.get()为0.000015 ms。 ;) –