<!--your preparation HTML code goes here-->
const birdSpecies = {
forest: {
species: [
{
name: "Northern Cardinal",
physicalCharacteristics: {
color: "Red",
size: "Medium",
beakType: "Conical"
},
diet: {
primary: "Seeds",
secondary: "Fruits"
},
habitat: "Woodlands and forests"
},
{
name: "Woodpecker",
physicalCharacteristics: {
color: "Black, White, and Red",
size: "Medium",
beakType: "Chisel-shaped"
},
diet: {
primary: "Insects",
secondary: "Tree sap"
},
habitat: "Wooded areas"
}
]
},
desert: {
species: [
{
name: "Roadrunner",
physicalCharacteristics: {
color: "Brown and White",
size: "Medium",
beakType: "Long and Slim"
},
diet: {
primary: "Insects",
secondary: "Small reptiles"
},
habitat: "Desert and arid regions"
},
{
name: "Cactus Wren",
physicalCharacteristics: {
color: "Brown with streaks",
size: "Small",
beakType: "Curved"
},
diet: {
primary: "Insects",
secondary: "Seeds"
},
habitat: "Cacti and desert shrubs"
}
]
},
wetlands: {
species: [
{
name: "Great Blue Heron",
physicalCharacteristics: {
color: "Blue-gray",
size: "Large",
beakType: "Long and Sharp"
},
diet: {
primary: "Fish",
secondary: "Amphibians"
},
habitat: "Wetlands and marshes"
},
{
name: "American Coot",
physicalCharacteristics: {
color: "Dark gray with white bill",
size: "Medium",
beakType: "Flat and short"
},
diet: {
primary: "Aquatic plants",
secondary: "Small invertebrates"
},
habitat: "Lakes and wetlands"
}
]
}
}
const frozenObject = Object.freeze(birdSpecies)
const nonFrozenObject = birdSpecies
for (const [habitat, data] of Object.entries(frozenObject)) {
console.log(`Habitat: ${habitat}`)
for (const bird of data.species) {
console.log(` Name: ${bird.name}`)
console.log(` Physical Characteristics:`)
for (const [key, value] of Object.entries(bird.physicalCharacteristics)) {
console.log(` ${key}: ${value}`)
}
console.log(` Diet:`)
for (const [key, value] of Object.entries(bird.diet)) {
console.log(` ${key}: ${value}`)
}
console.log(` Habitat: ${bird.habitat}`)
}
}
for (const [habitat, data] of Object.entries(nonFrozenObject)) {
console.log(`Habitat: ${habitat}`)
for (const bird of data.species) {
console.log(` Name: ${bird.name}`)
console.log(` Physical Characteristics:`)
for (const [key, value] of Object.entries(bird.physicalCharacteristics)) {
console.log(` ${key}: ${value}`)
}
console.log(` Diet:`)
for (const [key, value] of Object.entries(bird.diet)) {
console.log(` ${key}: ${value}`)
}
console.log(` Habitat: ${bird.habitat}`)
}
}
--enable-precise-memory-info
flag.
Test case name | Result |
---|---|
Loop Frozen Object | |
Loop Non-Frozen Object |
Test name | Executions per second |
---|---|
Loop Frozen Object | 8822.0 Ops/sec |
Loop Non-Frozen Object | 8800.9 Ops/sec |
The provided benchmark focuses on measuring performance differences when looping through properties of a JavaScript object that is either frozen or non-frozen. Here’s a breakdown of what is being tested, the comparisons made, and the implications of the results.
Frozen Object (frozenObject
):
Object.freeze()
, which prevents the modification of the object's properties, effectively making it immutable. Once an object is frozen, you cannot add, delete, or change its properties.Non-Frozen Object (nonFrozenObject
):
birdSpecies
object without any restrictions. This object can be modified at any time.Two test cases are run:
Loop Frozen Object: This test benchmarks how quickly the code can iterate over the properties of the frozen object.
Loop Non-Frozen Object: This test measures the iteration speed for a non-frozen object.
In both test cases, the same nested looping construct is used to access and log various properties of the bird species across multiple habitats.
Frozen Object:
Non-Frozen Object:
Memory Usage: Frozen objects can have advantages regarding memory usage since shared references can be made without the risk of alteration. Non-frozen objects may require additional memory for copies if frequent modifications are made.
Use Cases: Choosing between frozen and non-frozen depends on the use case. If the data structure is constant and does not require updates, using frozen objects can be beneficial.
Instead of freezing objects, developers can also use techniques such as:
Data structures like Typed Arrays or other specialized containers may also be suitable alternatives depending on the specific needs around data handling, memory constraints, or performance optimizations required.
In conclusion, this benchmark provides insight into the performance implications of using frozen versus non-frozen JavaScript objects, illuminating important considerations in application architecture and coding practices.