Được rồi, tôi đã thử nghiệm thêm, lặp và xóa các phần tử khỏi cả mảng và tập hợp. Tôi đã chạy thử nghiệm "nhỏ", sử dụng 10.000 phần tử và thử nghiệm "lớn", sử dụng 100.000 phần tử. Đây là kết quả.
Thêm các phần tử vào một bộ sưu tập
Có vẻ như .push
phương thức mảng nhanh hơn khoảng 4 lần so với .add
phương thức set, bất kể số phần tử được thêm vào.
Lặp lại và sửa đổi các phần tử trong một bộ sưu tập
Đối với phần này của bài kiểm tra, tôi đã sử dụng một for
vòng lặp để lặp qua mảng và một for of
vòng lặp để lặp qua tập hợp. Một lần nữa, việc lặp lại trên mảng nhanh hơn. Lần này có vẻ như nó sẽ theo cấp số nhân vì nó mất gấp đôi thời gian trong các bài kiểm tra "nhỏ" và gần gấp bốn lần trong các bài kiểm tra "lớn".
Xóa các phần tử khỏi bộ sưu tập
Bây giờ đây là nơi nó trở nên thú vị. Tôi đã sử dụng kết hợp một for
vòng lặp và .splice
để xóa một số phần tử khỏi mảng và tôi đã sử dụng for of
và .delete
để xóa một số phần tử khỏi tập hợp. Đối với các bài kiểm tra "nhỏ", việc xóa các mục khỏi tập hợp nhanh hơn khoảng ba lần (2,6 mili giây so với 7,1 mili giây) nhưng mọi thứ đã thay đổi đáng kể đối với bài kiểm tra "lớn", nơi nó mất tới 1955,1 mili giây để xóa các mục khỏi mảng trong khi chỉ mất 83,6 mili giây để xóa chúng khỏi tập hợp, nhanh hơn 23 lần.
Kết luận
Ở 10k phần tử, cả hai bài kiểm tra đều chạy với thời gian tương đương (mảng: 16,6 ms, set: 20,7 ms) nhưng khi xử lý với 100k phần tử, tập hợp là người chiến thắng rõ ràng (mảng: 1974,8 ms, set: 83,6 ms) nhưng chỉ do loại bỏ hoạt động. Nếu không thì mảng nhanh hơn. Tôi không thể nói chính xác tại sao lại như vậy.
Tôi đã thử với một số kịch bản kết hợp trong đó một mảng được tạo và điền, sau đó được chuyển đổi thành một tập hợp trong đó một số phần tử sẽ bị loại bỏ, tập hợp sau đó sẽ được chuyển đổi lại thành một mảng. Mặc dù làm điều này sẽ mang lại hiệu suất tốt hơn nhiều so với việc xóa các phần tử trong mảng, nhưng thời gian xử lý bổ sung cần thiết để chuyển đến và đi từ một tập hợp lớn hơn lợi ích của việc điền một mảng thay vì một tập hợp. Cuối cùng, sẽ nhanh hơn nếu chỉ giải quyết một tập hợp. Tuy nhiên, đó là một ý tưởng thú vị, rằng nếu người ta chọn sử dụng một mảng làm tập hợp dữ liệu cho một số dữ liệu lớn không có bản sao, thì đó có thể là một lợi thế về hiệu suất khôn ngoan, nếu có nhu cầu loại bỏ nhiều phần tử trong một để chuyển đổi mảng thành một tập hợp, thực hiện thao tác loại bỏ và chuyển đổi tập hợp trở lại một mảng.
Mã mảng:
var timer = function(name) {
var start = new Date();
return {
stop: function() {
var end = new Date();
var time = end.getTime() - start.getTime();
console.log('Timer:', name, 'finished in', time, 'ms');
}
}
};
var getRandom = function(min, max) {
return Math.random() * (max - min) + min;
};
var lastNames = ['SMITH', 'JOHNSON', 'WILLIAMS', 'JONES', 'BROWN', 'DAVIS', 'MILLER', 'WILSON', 'MOORE', 'TAYLOR', 'ANDERSON', 'THOMAS'];
var genLastName = function() {
var index = Math.round(getRandom(0, lastNames.length - 1));
return lastNames[index];
};
var sex = ["Male", "Female"];
var genSex = function() {
var index = Math.round(getRandom(0, sex.length - 1));
return sex[index];
};
var Person = function() {
this.name = genLastName();
this.age = Math.round(getRandom(0, 100))
this.sex = "Male"
};
var genPersons = function() {
for (var i = 0; i < 100000; i++)
personArray.push(new Person());
};
var changeSex = function() {
for (var i = 0; i < personArray.length; i++) {
personArray[i].sex = genSex();
}
};
var deleteMale = function() {
for (var i = 0; i < personArray.length; i++) {
if (personArray[i].sex === "Male") {
personArray.splice(i, 1)
i--
}
}
};
var t = timer("Array");
var personArray = [];
genPersons();
changeSex();
deleteMale();
t.stop();
console.log("Done! There are " + personArray.length + " persons.")
Đặt mã:
var timer = function(name) {
var start = new Date();
return {
stop: function() {
var end = new Date();
var time = end.getTime() - start.getTime();
console.log('Timer:', name, 'finished in', time, 'ms');
}
}
};
var getRandom = function (min, max) {
return Math.random() * (max - min) + min;
};
var lastNames = ['SMITH','JOHNSON','WILLIAMS','JONES','BROWN','DAVIS','MILLER','WILSON','MOORE','TAYLOR','ANDERSON','THOMAS'];
var genLastName = function() {
var index = Math.round(getRandom(0, lastNames.length - 1));
return lastNames[index];
};
var sex = ["Male", "Female"];
var genSex = function() {
var index = Math.round(getRandom(0, sex.length - 1));
return sex[index];
};
var Person = function() {
this.name = genLastName();
this.age = Math.round(getRandom(0,100))
this.sex = "Male"
};
var genPersons = function() {
for (var i = 0; i < 100000; i++)
personSet.add(new Person());
};
var changeSex = function() {
for (var key of personSet) {
key.sex = genSex();
}
};
var deleteMale = function() {
for (var key of personSet) {
if (key.sex === "Male") {
personSet.delete(key)
}
}
};
var t = timer("Set");
var personSet = new Set();
genPersons();
changeSex();
deleteMale();
t.stop();
console.log("Done! There are " + personSet.size + " persons.")