var image = 'data:image/png;base64,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';
var base64 = image.split(",").pop();
var base64 = image.substring(image.indexOf(',') + 1);
var base64 = image.substr(image.indexOf(',') + 1);
var base64 = image.slice(image.indexOf(',') + 1);
--enable-precise-memory-info
flag.
Test case name | Result |
---|---|
Array.split | |
Substring | |
Substr | |
Slice |
Test name | Executions per second |
---|---|
Array.split | 10424551.0 Ops/sec |
Substring | 12703480.0 Ops/sec |
Substr | 12672813.0 Ops/sec |
Slice | 12704022.0 Ops/sec |
The task is to write a function that takes an image URL, splits it into an array using the comma (,
) character as the delimiter, and then extracts the last element of this array.
Here's how you can do it in JavaScript:
function getBase64(imageUrl) {
const image = imageUrl.split(',').pop();
return image;
}
// Example usage:
const imageUrl = '...your base64 encoded image string here}';
console.log(getBase64(imageUrl));
However, this is a bit naive as it assumes that the URL will always be in the format base64,string1,string2
and only contains commas. In reality, there might be other characters or spaces in the URL.
To make it more robust, we can use regular expressions to extract the base64 string from the URL:
function getBase64(imageUrl) {
const regex = /base64,(.*)/;
const match = imageUrl.match(regex);
if (match && match[1]) {
return match[1];
} else {
throw new Error('Invalid base64 encoded image URL');
}
}
// Example usage:
const imageUrl = '...your base64 encoded image string here>';
console.log(getBase64(imageUrl));
This function uses a regular expression to find the first base64
followed by a comma and then captures any characters until it finds another comma. If there is no match, or if the captured group is empty, an error is thrown.
Now, let's assume that we have this getBase64
function implemented correctly, and we need to benchmark its performance against different methods of extracting the base64 string from the URL. We can do this by writing a test suite like the one provided in the question:
const getBase64 = require('./get-base64');
function arraySplitTest() {
const imageUrl = 'base64,string1,string2';
const start = performance.now();
for (let i = 0; i < 10000; i++) {
getBase64(imageUrl);
}
const end = performance.now();
console.log(`Array.split: ${end - start}ms`);
}
function substringTest() {
const imageUrl = 'base64,string1,string2';
const start = performance.now();
for (let i = 0; i < 10000; i++) {
getBase64(imageUrl.substring(imageUrl.indexOf(',') + 1));
}
const end = performance.now();
console.log(`Substring: ${end - start}ms`);
}
function substrTest() {
const imageUrl = 'base64,string1,string2';
const start = performance.now();
for (let i = 0; i < 10000; i++) {
getBase64(imageUrl.substr(imageUrl.indexOf(',') + 1));
}
const end = performance.now();
console.log(`Substr: ${end - start}ms`);
}
function sliceTest() {
const imageUrl = 'base64,string1,string2';
const start = performance.now();
for (let i = 0; i < 10000; i++) {
getBase64(imageUrl.slice(imageUrl.indexOf(',') + 1));
}
const end = performance.now();
console.log(`Slice: ${end - start}ms`);
}
arraySplitTest();
substringTest();
substrTest();
sliceTest();
This code defines four test functions, each testing a different method of extracting the base64 string from the URL. It uses performance.now()
to measure the time it takes to execute each function 10,000 times.
You can modify this code to suit your needs and add more tests as required.