Javascript的ES6 class写法和ES5闭包写法性能对比
看到很多闭包写法的函数,
一直怀疑它对性能是否有影响.
还有就是备受推崇的React Hooks函数式写法中出现大量的闭包和临时函数,
我很担心这样会影响性能.
于是, 做了一个实验来做对比.
这个实验很简单, 用md5计算一百万次.
计算过程将结果再放回参数, 这样避免结果没被引用被优化, 影响对比结果.
其中test.js采用闭包写法, test2.js采用class写法.
最终的对比结果如下图所示.
闭包的写法略差于class写法, 大概20%
因此对性能要求比较高的话, 还是推荐class写法.

下面是闭包写法test.js的代码
function md5 (string) {function rotateLeft(lValue, iShiftBits) {return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits));}function addUnsigned(lX, lY) {let lX8 = lX & 0x80000000;let lY8 = lY & 0x80000000;let lX4 = lX & 0x40000000;let lY4 = lY & 0x40000000;let lResult = (lX & 0x3fffffff) + (lY & 0x3fffffff);if (lX4 & lY4) {return lResult ^ 0x80000000 ^ lX8 ^ lY8;}if (lX4 | lY4) {if (lResult & 0x40000000) {return lResult ^ 0xc0000000 ^ lX8 ^ lY8;} else {return lResult ^ 0x40000000 ^ lX8 ^ lY8;}} else {return lResult ^ lX8 ^ lY8;}}function F(x, y, z) {return (x & y) | (~x & z);}function G(x, y, z) {return (x & z) | (y & ~z);}function H(x, y, z) {return x ^ y ^ z;}function I(x, y, z) {return y ^ (x | ~z);}function FF(a, b, c, d, x, s, ac) {a = addUnsigned(a, addUnsigned(addUnsigned(F(b, c, d), x), ac));return addUnsigned(rotateLeft(a, s), b);}function GG(a, b, c, d, x, s, ac) {a = addUnsigned(a, addUnsigned(addUnsigned(G(b, c, d), x), ac));return addUnsigned(rotateLeft(a, s), b);}function HH(a, b, c, d, x, s, ac) {a = addUnsigned(a, addUnsigned(addUnsigned(H(b, c, d), x), ac));return addUnsigned(rotateLeft(a, s), b);}function II(a, b, c, d, x, s, ac) {a = addUnsigned(a, addUnsigned(addUnsigned(I(b, c, d), x), ac));return addUnsigned(rotateLeft(a, s), b);}function convertToWordArray(string) {let lWordCount;let lMessageLength = string.length;let lNumberOfWordsTempOne = lMessageLength + 8;let lNumberOfWordsTempTwo = (lNumberOfWordsTempOne - (lNumberOfWordsTempOne % 64)) / 64;let lNumberOfWords = (lNumberOfWordsTempTwo + 1) * 16;let lWordArray = Array(lNumberOfWords - 1);let lBytePosition = 0;let lByteCount = 0;while (lByteCount < lMessageLength) {lWordCount = (lByteCount - (lByteCount % 4)) / 4;lBytePosition = (lByteCount % 4) * 8;lWordArray[lWordCount] =lWordArray[lWordCount] | (string.charCodeAt(lByteCount) << lBytePosition);lByteCount++;}lWordCount = (lByteCount - (lByteCount % 4)) / 4;lBytePosition = (lByteCount % 4) * 8;lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition);lWordArray[lNumberOfWords - 2] = lMessageLength << 3;lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29;return lWordArray;}function wordToHex(lValue) {let WordToHexValue = "";let WordToHexValueTemp = "";let lByte;for (let lCount = 0; lCount <= 3; lCount++) {lByte = (lValue >>> (lCount * 8)) & 255;WordToHexValueTemp = "0" + lByte.toString(16);WordToHexValue = WordToHexValue + WordToHexValueTemp.substr(WordToHexValueTemp.length - 2, 2);}return WordToHexValue;}function uTF8Encode(string) {string = string.replace(/\x0d\x0a/g, "\x0a");let output = "";for (let n = 0; n < string.length; n++) {let c = string.charCodeAt(n);if (c < 128) {output += String.fromCharCode(c);} else if (c > 127 && c < 2048) {output += String.fromCharCode((c >> 6) | 192);output += String.fromCharCode((c & 63) | 128);} else {output += String.fromCharCode((c >> 12) | 224);output += String.fromCharCode(((c >> 6) & 63) | 128);output += String.fromCharCode((c & 63) | 128);}}return output;}function res(string) {let x = [];let AA, BB, CC, DD;let S11 = 7;let S12 = 12;let S13 = 17;let S14 = 22;let S21 = 5;let S22 = 9;let S23 = 14;let S24 = 20;let S31 = 4;let S32 = 11;let S33 = 16;let S34 = 23;let S41 = 6;let S42 = 10;let S43 = 15;let S44 = 21;string = uTF8Encode(string);x = convertToWordArray(string);let a = 0x67452301;let b = 0xefcdab89;let c = 0x98badcfe;let d = 0x10325476;for (let k = 0; k < x.length; k += 16) {AA = a;BB = b;CC = c;DD = d;a = FF(a, b, c, d, x[k + 0], S11, 0xd76aa478);d = FF(d, a, b, c, x[k + 1], S12, 0xe8c7b756);c = FF(c, d, a, b, x[k + 2], S13, 0x242070db);b = FF(b, c, d, a, x[k + 3], S14, 0xc1bdceee);a = FF(a, b, c, d, x[k + 4], S11, 0xf57c0faf);d = FF(d, a, b, c, x[k + 5], S12, 0x4787c62a);c = FF(c, d, a, b, x[k + 6], S13, 0xa8304613);b = FF(b, c, d, a, x[k + 7], S14, 0xfd469501);a = FF(a, b, c, d, x[k + 8], S11, 0x698098d8);d = FF(d, a, b, c, x[k + 9], S12, 0x8b44f7af);c = FF(c, d, a, b, x[k + 10], S13, 0xffff5bb1);b = FF(b, c, d, a, x[k + 11], S14, 0x895cd7be);a = FF(a, b, c, d, x[k + 12], S11, 0x6b901122);d = FF(d, a, b, c, x[k + 13], S12, 0xfd987193);c = FF(c, d, a, b, x[k + 14], S13, 0xa679438e);b = FF(b, c, d, a, x[k + 15], S14, 0x49b40821);a = GG(a, b, c, d, x[k + 1], S21, 0xf61e2562);d = GG(d, a, b, c, x[k + 6], S22, 0xc040b340);c = GG(c, d, a, b, x[k + 11], S23, 0x265e5a51);b = GG(b, c, d, a, x[k + 0], S24, 0xe9b6c7aa);a = GG(a, b, c, d, x[k + 5], S21, 0xd62f105d);d = GG(d, a, b, c, x[k + 10], S22, 0x2441453);c = GG(c, d, a, b, x[k + 15], S23, 0xd8a1e681);b = GG(b, c, d, a, x[k + 4], S24, 0xe7d3fbc8);a = GG(a, b, c, d, x[k + 9], S21, 0x21e1cde6);d = GG(d, a, b, c, x[k + 14], S22, 0xc33707d6);c = GG(c, d, a, b, x[k + 3], S23, 0xf4d50d87);b = GG(b, c, d, a, x[k + 8], S24, 0x455a14ed);a = GG(a, b, c, d, x[k + 13], S21, 0xa9e3e905);d = GG(d, a, b, c, x[k + 2], S22, 0xfcefa3f8);c = GG(c, d, a, b, x[k + 7], S23, 0x676f02d9);b = GG(b, c, d, a, x[k + 12], S24, 0x8d2a4c8a);a = HH(a, b, c, d, x[k + 5], S31, 0xfffa3942);d = HH(d, a, b, c, x[k + 8], S32, 0x8771f681);c = HH(c, d, a, b, x[k + 11], S33, 0x6d9d6122);b = HH(b, c, d, a, x[k + 14], S34, 0xfde5380c);a = HH(a, b, c, d, x[k + 1], S31, 0xa4beea44);d = HH(d, a, b, c, x[k + 4], S32, 0x4bdecfa9);c = HH(c, d, a, b, x[k + 7], S33, 0xf6bb4b60);b = HH(b, c, d, a, x[k + 10], S34, 0xbebfbc70);a = HH(a, b, c, d, x[k + 13], S31, 0x289b7ec6);d = HH(d, a, b, c, x[k + 0], S32, 0xeaa127fa);c = HH(c, d, a, b, x[k + 3], S33, 0xd4ef3085);b = HH(b, c, d, a, x[k + 6], S34, 0x4881d05);a = HH(a, b, c, d, x[k + 9], S31, 0xd9d4d039);d = HH(d, a, b, c, x[k + 12], S32, 0xe6db99e5);c = HH(c, d, a, b, x[k + 15], S33, 0x1fa27cf8);b = HH(b, c, d, a, x[k + 2], S34, 0xc4ac5665);a = II(a, b, c, d, x[k + 0], S41, 0xf4292244);d = II(d, a, b, c, x[k + 7], S42, 0x432aff97);c = II(c, d, a, b, x[k + 14], S43, 0xab9423a7);b = II(b, c, d, a, x[k + 5], S44, 0xfc93a039);a = II(a, b, c, d, x[k + 12], S41, 0x655b59c3);d = II(d, a, b, c, x[k + 3], S42, 0x8f0ccc92);c = II(c, d, a, b, x[k + 10], S43, 0xffeff47d);b = II(b, c, d, a, x[k + 1], S44, 0x85845dd1);a = II(a, b, c, d, x[k + 8], S41, 0x6fa87e4f);d = II(d, a, b, c, x[k + 15], S42, 0xfe2ce6e0);c = II(c, d, a, b, x[k + 6], S43, 0xa3014314);b = II(b, c, d, a, x[k + 13], S44, 0x4e0811a1);a = II(a, b, c, d, x[k + 4], S41, 0xf7537e82);d = II(d, a, b, c, x[k + 11], S42, 0xbd3af235);c = II(c, d, a, b, x[k + 2], S43, 0x2ad7d2bb);b = II(b, c, d, a, x[k + 9], S44, 0xeb86d391);a = addUnsigned(a, AA);b = addUnsigned(b, BB);c = addUnsigned(c, CC);d = addUnsigned(d, DD);}let tempValue = wordToHex(a) + wordToHex(b) + wordToHex(c) + wordToHex(d);return tempValue.toLowerCase();}return res(string);
}function testMd5() {let startTick = Date.now() / 1000;let result = "测试文本字符串测试文本字符串测试文本字符串";for (let i = 0; i< 1e6; ++i) {result = md5(result+i);}console.log(result);let endTick = Date.now() / 1000; console.log(endTick - startTick);
}testMd5();
下面是类写法test2.js的代码.
class Md5Class {rotateLeft(lValue, iShiftBits) {return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits));}addUnsigned(lX, lY) {let lX8 = lX & 0x80000000;let lY8 = lY & 0x80000000;let lX4 = lX & 0x40000000;let lY4 = lY & 0x40000000;let lResult = (lX & 0x3fffffff) + (lY & 0x3fffffff);if (lX4 & lY4) {return lResult ^ 0x80000000 ^ lX8 ^ lY8;}if (lX4 | lY4) {if (lResult & 0x40000000) {return lResult ^ 0xc0000000 ^ lX8 ^ lY8;} else {return lResult ^ 0x40000000 ^ lX8 ^ lY8;}} else {return lResult ^ lX8 ^ lY8;}}F(x, y, z) {return (x & y) | (~x & z);}G(x, y, z) {return (x & z) | (y & ~z);}H(x, y, z) {return x ^ y ^ z;}I(x, y, z) {return y ^ (x | ~z);}FF(a, b, c, d, x, s, ac) {a = this.addUnsigned(a, this.addUnsigned(this.addUnsigned(this.F(b, c, d), x), ac));return this.addUnsigned(this.rotateLeft(a, s), b);}GG(a, b, c, d, x, s, ac) {a = this.addUnsigned(a, this.addUnsigned(this.addUnsigned(this.G(b, c, d), x), ac));return this.addUnsigned(this.rotateLeft(a, s), b);}HH(a, b, c, d, x, s, ac) {a = this.addUnsigned(a, this.addUnsigned(this.addUnsigned(this.H(b, c, d), x), ac));return this.addUnsigned(this.rotateLeft(a, s), b);}II(a, b, c, d, x, s, ac) {a = this.addUnsigned(a, this.addUnsigned(this.addUnsigned(this.I(b, c, d), x), ac));return this.addUnsigned(this.rotateLeft(a, s), b);}convertToWordArray(string) {let lWordCount;let lMessageLength = string.length;let lNumberOfWordsTempOne = lMessageLength + 8;let lNumberOfWordsTempTwo = (lNumberOfWordsTempOne - (lNumberOfWordsTempOne % 64)) / 64;let lNumberOfWords = (lNumberOfWordsTempTwo + 1) * 16;let lWordArray = Array(lNumberOfWords - 1);let lBytePosition = 0;let lByteCount = 0;while (lByteCount < lMessageLength) {lWordCount = (lByteCount - (lByteCount % 4)) / 4;lBytePosition = (lByteCount % 4) * 8;lWordArray[lWordCount] =lWordArray[lWordCount] | (string.charCodeAt(lByteCount) << lBytePosition);lByteCount++;}lWordCount = (lByteCount - (lByteCount % 4)) / 4;lBytePosition = (lByteCount % 4) * 8;lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition);lWordArray[lNumberOfWords - 2] = lMessageLength << 3;lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29;return lWordArray;}wordToHex(lValue) {let WordToHexValue = "";let WordToHexValueTemp = "";let lByte;for (let lCount = 0; lCount <= 3; lCount++) {lByte = (lValue >>> (lCount * 8)) & 255;WordToHexValueTemp = "0" + lByte.toString(16);WordToHexValue = WordToHexValue + WordToHexValueTemp.substr(WordToHexValueTemp.length - 2, 2);}return WordToHexValue;}uTF8Encode(string) {string = string.replace(/\x0d\x0a/g, "\x0a");let output = "";for (let n = 0; n < string.length; n++) {let c = string.charCodeAt(n);if (c < 128) {output += String.fromCharCode(c);} else if (c > 127 && c < 2048) {output += String.fromCharCode((c >> 6) | 192);output += String.fromCharCode((c & 63) | 128);} else {output += String.fromCharCode((c >> 12) | 224);output += String.fromCharCode(((c >> 6) & 63) | 128);output += String.fromCharCode((c & 63) | 128);}}return output;}res(string) {let x = [];let AA, BB, CC, DD;let S11 = 7;let S12 = 12;let S13 = 17;let S14 = 22;let S21 = 5;let S22 = 9;let S23 = 14;let S24 = 20;let S31 = 4;let S32 = 11;let S33 = 16;let S34 = 23;let S41 = 6;let S42 = 10;let S43 = 15;let S44 = 21;string = this.uTF8Encode(string);x = this.convertToWordArray(string);let a = 0x67452301;let b = 0xefcdab89;let c = 0x98badcfe;let d = 0x10325476;for (let k = 0; k < x.length; k += 16) {AA = a;BB = b;CC = c;DD = d;a = this.FF(a, b, c, d, x[k + 0], S11, 0xd76aa478);d = this.FF(d, a, b, c, x[k + 1], S12, 0xe8c7b756);c = this.FF(c, d, a, b, x[k + 2], S13, 0x242070db);b = this.FF(b, c, d, a, x[k + 3], S14, 0xc1bdceee);a = this.FF(a, b, c, d, x[k + 4], S11, 0xf57c0faf);d = this.FF(d, a, b, c, x[k + 5], S12, 0x4787c62a);c = this.FF(c, d, a, b, x[k + 6], S13, 0xa8304613);b = this.FF(b, c, d, a, x[k + 7], S14, 0xfd469501);a = this.FF(a, b, c, d, x[k + 8], S11, 0x698098d8);d = this.FF(d, a, b, c, x[k + 9], S12, 0x8b44f7af);c = this.FF(c, d, a, b, x[k + 10], S13, 0xffff5bb1);b = this.FF(b, c, d, a, x[k + 11], S14, 0x895cd7be);a = this.FF(a, b, c, d, x[k + 12], S11, 0x6b901122);d = this.FF(d, a, b, c, x[k + 13], S12, 0xfd987193);c = this.FF(c, d, a, b, x[k + 14], S13, 0xa679438e);b = this.FF(b, c, d, a, x[k + 15], S14, 0x49b40821);a = this.GG(a, b, c, d, x[k + 1], S21, 0xf61e2562);d = this.GG(d, a, b, c, x[k + 6], S22, 0xc040b340);c = this.GG(c, d, a, b, x[k + 11], S23, 0x265e5a51);b = this.GG(b, c, d, a, x[k + 0], S24, 0xe9b6c7aa);a = this.GG(a, b, c, d, x[k + 5], S21, 0xd62f105d);d = this.GG(d, a, b, c, x[k + 10], S22, 0x2441453);c = this.GG(c, d, a, b, x[k + 15], S23, 0xd8a1e681);b = this.GG(b, c, d, a, x[k + 4], S24, 0xe7d3fbc8);a = this.GG(a, b, c, d, x[k + 9], S21, 0x21e1cde6);d = this.GG(d, a, b, c, x[k + 14], S22, 0xc33707d6);c = this.GG(c, d, a, b, x[k + 3], S23, 0xf4d50d87);b = this.GG(b, c, d, a, x[k + 8], S24, 0x455a14ed);a = this.GG(a, b, c, d, x[k + 13], S21, 0xa9e3e905);d = this.GG(d, a, b, c, x[k + 2], S22, 0xfcefa3f8);c = this.GG(c, d, a, b, x[k + 7], S23, 0x676f02d9);b = this.GG(b, c, d, a, x[k + 12], S24, 0x8d2a4c8a);a = this.HH(a, b, c, d, x[k + 5], S31, 0xfffa3942);d = this.HH(d, a, b, c, x[k + 8], S32, 0x8771f681);c = this.HH(c, d, a, b, x[k + 11], S33, 0x6d9d6122);b = this.HH(b, c, d, a, x[k + 14], S34, 0xfde5380c);a = this.HH(a, b, c, d, x[k + 1], S31, 0xa4beea44);d = this.HH(d, a, b, c, x[k + 4], S32, 0x4bdecfa9);c = this.HH(c, d, a, b, x[k + 7], S33, 0xf6bb4b60);b = this.HH(b, c, d, a, x[k + 10], S34, 0xbebfbc70);a = this.HH(a, b, c, d, x[k + 13], S31, 0x289b7ec6);d = this.HH(d, a, b, c, x[k + 0], S32, 0xeaa127fa);c = this.HH(c, d, a, b, x[k + 3], S33, 0xd4ef3085);b = this.HH(b, c, d, a, x[k + 6], S34, 0x4881d05);a = this.HH(a, b, c, d, x[k + 9], S31, 0xd9d4d039);d = this.HH(d, a, b, c, x[k + 12], S32, 0xe6db99e5);c = this.HH(c, d, a, b, x[k + 15], S33, 0x1fa27cf8);b = this.HH(b, c, d, a, x[k + 2], S34, 0xc4ac5665);a = this.II(a, b, c, d, x[k + 0], S41, 0xf4292244);d = this.II(d, a, b, c, x[k + 7], S42, 0x432aff97);c = this.II(c, d, a, b, x[k + 14], S43, 0xab9423a7);b = this.II(b, c, d, a, x[k + 5], S44, 0xfc93a039);a = this.II(a, b, c, d, x[k + 12], S41, 0x655b59c3);d = this.II(d, a, b, c, x[k + 3], S42, 0x8f0ccc92);c = this.II(c, d, a, b, x[k + 10], S43, 0xffeff47d);b = this.II(b, c, d, a, x[k + 1], S44, 0x85845dd1);a = this.II(a, b, c, d, x[k + 8], S41, 0x6fa87e4f);d = this.II(d, a, b, c, x[k + 15], S42, 0xfe2ce6e0);c = this.II(c, d, a, b, x[k + 6], S43, 0xa3014314);b = this.II(b, c, d, a, x[k + 13], S44, 0x4e0811a1);a = this.II(a, b, c, d, x[k + 4], S41, 0xf7537e82);d = this.II(d, a, b, c, x[k + 11], S42, 0xbd3af235);c = this.II(c, d, a, b, x[k + 2], S43, 0x2ad7d2bb);b = this.II(b, c, d, a, x[k + 9], S44, 0xeb86d391);a = this.addUnsigned(a, AA);b = this.addUnsigned(b, BB);c = this.addUnsigned(c, CC);d = this.addUnsigned(d, DD);}let tempValue = this.wordToHex(a) + this.wordToHex(b) + this.wordToHex(c) + this.wordToHex(d);return tempValue.toLowerCase();}
}
let md5 = new Md5Class();function testMd5() {let startTick = Date.now() / 1000;let result = "测试文本字符串测试文本字符串测试文本字符串";for (let i = 0; i< 1e6; ++i) {result = md5.res(result+i);}console.log(result);let endTick = Date.now() / 1000; console.log(endTick - startTick);
}testMd5();
还有就是对于React Hooks写法, 个人感觉,
会导致代码更凌乱, 结构层次不清晰, 可读性和可维护性下降.
相关文章:
Javascript的ES6 class写法和ES5闭包写法性能对比
看到很多闭包写法的函数, 一直怀疑它对性能是否有影响. 还有就是备受推崇的React Hooks函数式写法中出现大量的闭包和临时函数, 我很担心这样会影响性能. 于是, 做了一个实验来做对比. 这个实验很简单, 用md5计算一百万次. 计算过程将结果再放回参数, 这样避免结果没被引用被…...
探秘MySQL——全面了解索引、索引优化规则
文章目录0.什么是索引1.常用索引分类逻辑维度底层数据结构维度物理维度(InnoDB)2.为什么底层是B树平衡二叉查找树红黑树B树(多叉)B树(多叉)3.MySQL索引优化SQL性能分析之explainQ.MySQL如何查看查询是否用到…...
战斗力最强排行榜:10-30人团队任务管理工具
工欲善其事,必先利其器。在高效的任务执行过程中,选择灵活轻便的项目管理工具来提升工作效率、适应快速多变的发展诉求,对团队来说,至关重要。但是如果团队不大,企业对这块的预算又有限,大型的团队任务管理…...
2023-03-09干活小计
强化学习: 强化学习用智能体(agent)这个概念来表示做决策的机器。 感知、决策和奖励 感知。智能体在…...
基数排序算法
目录:什么是基数排序?基本原理核心思想实现逻辑代码实现复杂度分析总结什么是基数排序? 基数排序:基数排序(Radix sort)是一种非比较型整数排序算法, 基本思想主要是通过关键字间的比较和移动记…...
项目实战典型案例24——xxljob控制台不打印日志排查
xxljob控制台不打印日志排查一:背景介绍问题截图问题解读二:思路&方案三:过程四:总结一:背景介绍 本篇博客是对xxljob控制台不打印日志排查进行的总结和进行的改进。 目的是将经历转变为自己的经验。通过博客的方…...
旋转框目标检测mmrotate v1.0.0rc1 之RTMDet训练DOTA的官方问题解析整理(四)
关于rotated_rtmdet_l-coco_pretrain-3x-dota_ms.py配置文件的batchsize和学习率设置问题:回答:如何在mmrotate中绘制特征图问题:回答:你好AllieLan,您可以尝试使用https://github.com/open-mmlab/mmyolo/blob/main/de…...
4个顶级的华为/小米/OPPO/Vivo手机屏幕解锁工具软件
有好几次用户发现自己被锁定在他们的华为/小米/OPPO/Vivo设备之外,我们知道这可能是一种非常可怕的体验。在这种情况下,找到安卓手机解锁软件,重新获得手机中重要数据和文件的访问权限。看看这篇文章,因为我们将与您分享什么是解锁…...
华为OD机试题 - 和最大子矩阵(JavaScript)| 机考必刷
更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:和最大子矩阵题目输入输出示例一输入输出说明Code思路版权说明华…...
企业电子招标采购系统源码之项目说明和开发类型
项目说明 随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及…...
Python高频面试题——装饰器(带大家理解装饰器的本质)
装饰器概念装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限验证等场景…...
全方位解读智能中控屏发展趋势!亚马逊Alexa语音+Matter能力成必备
随着智能家居行业逐步从碎片化的智能单品阶段,迈向体验更完整的全屋互联阶段,智能中控屏作为智能家居最佳的入口之一,在年轻人青睐全屋智能装修的风潮下,市场潜力彻底被引爆。 一、为什么是智能中控屏? 在智能音箱增…...
JAVA练习74-括号生成
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 提示:这里可以添加本文要记录的大概内容: 3月10日练习内容 提示:以下是本篇文章正文内容,下面案例可供参考 一、题目-…...
Java ORM开发 更全面的应用场景
1. 一个web系统, 想支持多种数据库, 如同时要用mysql, oracle 需要动态切换数据源? 2. 读写分离, 但读库与写库是不同的类型, 如分别是: mysql, oracle 3. 智能化自动过滤null和空字符串,不再需要写判断非空的代码。 4.动态/任意组合查询条件,不需要提前准备da…...
SpringBoot【基础篇】---- 基础配置
SpringBoot【基础篇】---- 基础配置1. 属性配置2. 配置文件分类3. yaml 文件4. yaml 数据读取1. 读取单一数据2. 读取全部数据3. 读取对象数据yaml 文件中的数据引用1. 属性配置 SpringBoot 通过配置文件 application.properties 就可以修改默认的配置,那咱们就先找…...
手机磁吸背夹散热器制冷快速方案
手机散热器是什么?手机散热器分为几种类型?手机散热的方式都有哪些? 因为经常玩游戏,手机发热得厉害,都可以煎鸡蛋了,心想着要买个东西给手机散散热,没想到还真的有手机散热器。 不知道手机散…...
青岛OJ(QingdaoU/OnlineJudge)部署如何直连数据库批量修改
1.postgres数据库QingdaoU/OnlineJudge用的数据库是postgreSQL,一个关系型数据库。默认端口是5432,我们下载一个navcat 15以上的版本,用来连数据库。2.修改docker-compose.yml文件修改docker-compose.yml,手动添加一个端口&#x…...
渗透测试——信息收集(详细)
信息收集:前言:信息收集是渗透测试除了授权之外的第一步,也是关键的一步,尽量多的收集目标的信息会给后续的渗透事半功倍。收集信息的思路有很多,例如:页面信息收集、域名信息收集、敏感信息收集、子域名收…...
什么是谐波
什么是谐波 目录 1. 问题的提出 2. “谐”字在中英文中的原意 2.1 “谐”字在汉语中的原义 2.2 “谐”字对应的英语词的原义 3.“harmonics(谐波)”概念是谁引入物理学中的? 4.“harmonics(谐波)”的数学解释 1. 问题的提出 “谐波”这个术语用于各种学科&am…...
技术报告:程序员如何开发一个商城型购物网站
前言随着互联网的快速发展,电商行业正成为越来越多人的选择。而作为电商行业的主要参与者之一,商城型购物网站的开发则成为程序员不可避免的任务之一。本文将对商城型购物网站的开发进行详细阐述,包括需求分析、架构设计、技术选型、前后端开…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...
