国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

優(yōu)化 JavaScript - 密碼生成器(速度提高 2.15 倍)

我在 Github explore 上搜索時發(fā)現了一個密碼生成器(omgopass)(https://github.com/omgovich/omgopass),據說它比其他替代品要快得多。比 600 倍快password-generator(https://www.npmjs.com/package/password-generator)。

這是基準測試omgopass顯示:

原始 omgopass 基準

看到這個后,我記得幾周前我做了一個密碼生成器,并且沒有執(zhí)行任何基準測試,所以我決定用其他庫測試我的方法。

令我驚訝的是,它表現得相當好,在相同的基準測試中獲得第二名,如上所示。即使不嘗試也很好。

使用我的 pass 生成器進行基準測試 ( passGenny)(https://github.com/nombrekeff/pass-genny):

通過 passGenny 進行基準測試

注意事項

該基準測試并不能反映庫的質量或開發(fā)人員的技能,以真正確保應該進行更多的測試和基準測試。

此外,每個庫的功能也有所不同,有些是可讀的,有些則不可讀。有些使用加密進行隨機,有些則不使用。

話雖這么說,

讓我們讓passGenny更快

我決定嘗試一下,并嘗試優(yōu)化它,讓我們看看原始代碼:

class PasswordGenerator {
    static upperCaseChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');
    static lowerCaseChars = 'abcdefghijklmnopqrstuvwxyz'.split('');
    static symbolsChars = '<>[]{}=?()&%$#@!???*_-.:;,'.split('');
    static numbersString = '0123456789'.split('');

    constructor(options = {}) {
        this.options = {
            uppercase: true,
            lowercase: true,
            symbols: false,
            numbers: true,
            readable: false,
            length: 12,
            ...options,
        };
    }

    updateOptions(newOptions = {}) {
        this.options = {
            ...this.options,
            ...newOptions,
        };
    }

    random(min = 0, max = 10) {
        return Math.floor(
            Math.random() * (max - min) + min
        );
    }

    _getCharactersForOptions() {
        const combinedCaracters = [];

        if (this.options.lowercase)
            combinedCaracters.push(...PasswordGenerator.lowerCaseChars);
        if (this.options.uppercase)
            combinedCaracters.push(...PasswordGenerator.upperCaseChars);
        if (this.options.symbols)
            combinedCaracters.push(...PasswordGenerator.symbolsChars);
        if (this.options.numbers)
            combinedCaracters.push(...PasswordGenerator.numbersString);

        return combinedCaracters;
    }

    generate() {
        let combinedCaracters = this._getCharactersForOptions();
        let password = '';

        for (let c = 0; c < this.options.length; c++) {
            password += combinedCaracters[this.random(0, combinedCaracters.length)];
        }

        return password;
    }
}

這個類的作用是,從一組選項中生成密碼。它通過將(選項)允許的所有字符組合到一個數組中來實現此目的,然后迭代密碼的長度(由選項定義),并從該數組中獲取隨機字符。

夠簡單吧?現在,我認為我們可以對此進行一些優(yōu)化,好嗎?

優(yōu)化1

好的,我注意到的第一件事是,在 中_getCharactersForOptions,我使用數組來保存有效字符。使用擴展運算符將它們附加到combinedCaracters數組中。

這有點多余,因為我們可以一直使用字符串。連接字符串比組合數組便宜得多。

讓我們看看我們可以改變什么。

首先我們需要改變存儲字符的方式,我們不需要分割它們:

class PasswordGenerator {
    static upperCaseChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    static lowerCaseChars = 'abcdefghijklmnopqrstuvwxyz';
    static symbolsChars = '<>[]{}=?()&%$#@!???*_-.:;,';
    static numbersString = '0123456789';
    // ... more code
}

太好了,現在我們來修改_getCharactersForOptions方法:

class PasswordGenerator {
    _getCharactersForOptions() {
        let combinedCaracters = '';

        if (this.options.lowercase)
            combinedCaracters += PasswordGeneratorFast1.lowerCaseChars;
        if (this.options.uppercase)
            combinedCaracters += PasswordGeneratorFast1.upperCaseChars;
        if (this.options.symbols)
            combinedCaracters += PasswordGeneratorFast1.symbolsChars;
        if (this.options.numbers)
            combinedCaracters += PasswordGeneratorFast1.numbersString;

        return combinedCaracters;
    }
}

請注意我們現在如何返回一個字符串,而不是一個數組。

讓我們看看它在基準測試中的表現如何

通過一級優(yōu)化的 passGenny 進行基準測試

媽的,沒想到變化這么大,幾乎翻了一倍。

正如您所看到的,在這種特殊情況下,字符串的性能比數組好得多。

可是等等

我想我可以進一步優(yōu)化它,你可能已經注意到,使用相同的選項,結果_getCharactersForOptions總是相同的。這意味著我們不需要連接每個密碼上的字符串,我們只需要在選項更改時生成它們。

我們可以通過多種方式來解決這個問題,使用記憶化(可能更好)、圍繞對象創(chuàng)建代理或我接下來將向您展示的簡單方法。

優(yōu)化2

我要做的是,將選項設為私有,并迫使人們使用updateOptions方法更改選項。這將允許我標記選項是否已更改。

讓我們看一下完整的示例,然后我將對其進行分解:

class PasswordGeneratorFast2 {
    static upperCaseChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    static lowerCaseChars = 'abcdefghijklmnopqrstuvwxyz';
    static symbolsChars = '<>[]{}=?()&%$#@!???*_-.:;,';
    static numbersString = '0123456789';

    constructor(options = {}, randomFn) {
        this._options = {
            uppercase: true,
            lowercase: true,
            symbols: false,
            numbers: true,
            readable: false,
            length: 12,
            ...options,
        };
        this._random = randomFn || mathRandom;
        this._combinedCharacters = '';
        this._optionsChanged = true;
        this._getCharactersForOptions();
    }

    updateOptions(newOptions = {}) {
        this._options = {
            ...this._options,
            ...newOptions,
        };
        this._optionsChanged = true;
    }

    generate() {
        const combinedCaracters = this._getCharactersForOptions();
        const length = combinedCaracters.length;
        let password = '';

        for (let c = 0; c < this._options.length; c++) {
            password = password.concat(combinedCaracters[this._random(0, length)]);
        }

        return password;
    }

    _getCharactersForOptions() {
        // If options have not changed, we can return the previoulsy combined characters
        if (!this._optionsChanged) return this._combinedCharacters;

        let combinedCaracters = '';

        if (this._options.lowercase)
            combinedCaracters += PasswordGeneratorFast1.lowerCaseChars;
        if (this._options.uppercase)
            combinedCaracters += PasswordGeneratorFast1.upperCaseChars;
        if (this._options.symbols)
            combinedCaracters += PasswordGeneratorFast1.symbolsChars;
        if (this._options.numbers)
            combinedCaracters += PasswordGeneratorFast1.numbersString;

        // Update and mark options as not changed
        this._combinedCharacters = combinedCaracters;
        this._optionsChanged = false;

        return this._combinedCharacters;
    }
}
  1. 我們添加, 指示自上次調用_optionsChanged以來選項是否已更改。_getCharactersForOptions

  2. 我們將最后一個組合字符存儲在_combinedCharacters

  3. 我們修改_getCharactersForOptions,這樣如果選項沒有改變,我們返回最后生成的_combinedCharacters

  4. 我們改變password +=(password.concat()在我的測試中,它 concat 的表現比 += 更好)

就是這樣,讓我們看看它是如何做到的:

passGenny 的基準測試具有兩個優(yōu)化級別

如果你問我的話,令人印象深刻的是,我們傳球的速度比吉尼快了一倍,以相當大的優(yōu)勢取得了第一。如果我們像omgovich那樣表述它,它比密碼生成器passGenny(https://www.npmjs.com/package/password-generator)快 2,444 倍

從中可以得到什么?

  • 保持簡單可以等同于高性能

  • 如果不需要,不要使用數組

  • 檢查是否每次都需要執(zhí)行操作

  • 如果您需要性能,有時較小的事情會產生最大的差異

PD:我不是性能專家,所以我可能會錯過一些重要的事情,如果我錯過了某些內容或誤解了結果,請告訴我。

網友反饋留言1

您還可以進行一些改進(主要針對 DX,而不是針對性能):

  • 使用 使私有成員真正成為私有成員#。

  • 使用 getter 和 setter。

  • 將靜力學移至常量。

  • 的經典類過程this.generate = this.generate.bind(this);,因此人們可以在地圖等內容中使用該函數而不會出現問題。

應用這些建議,代碼看起來像這樣(我添加了 JSDocs 以獲得更好的 DX):

/**
 * @typedef PasswordGeneratorOptions
 * @property {number} [length=12]
 * @property {boolean} [lowercase=true]
 * @property {boolean} [numbers=true]
 * @property {typeof mathRandom} [randomFunction=mathRandom]
 * @property {boolean} [symbols=false]
 * @property {boolean} [uppercase=true]
 *//**
 * @param {number} min
 * @param {number} max
 */const mathRandom = (min, max) => Math.floor(Math.random() * (max - min) + min);const uppercaseChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";const lowercaseChars = "abcdefghijklmnopqrstuvwxyz";const symbolsChars = "<>[]{}=?()&%$#@!???*_-.:;,";const numbersString = "0123456789";export class PasswordGeneratorFast {
    /** @type {PasswordGeneratorOptions} */
    #options = {
        length: 12,
        lowercase: true,
        numbers: true,
        randomFunction: mathRandom,
        symbols: false,
        uppercase: true
    };
    #characters = "";
    #optionsChanged = true;
    set options(options) {
        this.#optionsChanged = true;
        this.#options = {
            ...this.#options,
            ...options
        };
    }
    get options() {
        return this.#options;
    }
    get characters() {
        if (this.#optionsChanged) {
            this.#characters =
                (this.#options.lowercase ? lowercaseChars : "") +
                (this.#options.uppercase ? uppercaseChars : "") +
                (this.#options.symbols ? symbolsChars : "") +
                (this.#options.numbers ? numbersString : "");
            this.#optionsChanged = false;
        }
        return this.#characters;
    }
    /** @param {PasswordGeneratorOptions} options */
    constructor(options = {}) {
        this.options = options;
        this.generate = this.generate.bind(this);
    }
    generate() {
        const { characters } = this;
        const length = characters.length;
        let password = "";
        for (let char = 0; char < this.#options.length; char++) {
            password = password.concat(
                characters[this.#options.randomFunction(0, length)]
            );
        }
        return password;
    }}

性能方面我的可能是最差的(沒有測試它,但我認為 setter/getter 的性能不如僅使用方法,我可能是錯的),但除了性能之外,我們總是必須考慮 DX,并且從我的從角度來看,在處理類時,getter 和 setter 提供了更好的 DX。我個人更喜歡只使用函數,甚至不去上課。

網友反饋留言1

我的主要原因主要是用法:

import { Something } from "./Something";

console.log(Something.aValue);

// vs

import { aValue } from "./Something";

console.log(aValue);

我知道,超級利基,但是以前從類中有用的封裝現在我從模塊中獲得:D文章來源地址http://www.zghlxwxcb.cn/article/377.html

到此這篇關于優(yōu)化 JavaScript - 密碼生成器(速度提高 2.15 倍)的文章就介紹到這了,更多相關內容可以在右上角搜索或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

原文地址:http://www.zghlxwxcb.cn/article/377.html

如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請聯系站長進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 一個解放雙手、提高工作效率的代碼生成器!

    大家好,我是 Java陳序員 。 要說現在 Java 后端開發(fā)中,最火的框架肯定是 SpringBoot 。 而持久層的框架首推 MyBatis , MyBatisPlus 作為 MyBatis 的增強框架,其強大的 CURD 能力,被廣大的開發(fā)者所喜愛! SpringBoot + MyBatisPlus 可以說是王炸級別的組合! 今天給大家介紹一個可以 快速生

    2024年02月05日
    瀏覽(17)
  • Python中的迭代器與生成器提高性能的秘密武器【第143篇—迭代器與生成器】

    Python中的迭代器與生成器提高性能的秘密武器【第143篇—迭代器與生成器】

    前些天發(fā)現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。【點擊進入巨牛的人工智能學習網站】。 在Python編程中,迭代器和生成器是提高性能和減少內存消耗的重要工具。它們不僅簡化了代碼結構,而且在處理大型數據集時具有明顯的優(yōu)勢

    2024年03月24日
    瀏覽(26)
  • Javascript——生成器(Generator)自動執(zhí)行

    Generator自動化是通過Thunk函數進行實現,寫這篇文章的目的是為了理解通過Thunk實現Generator函數的自動執(zhí)行。 我們可以帶入一個業(yè)務場景來幫助我們理解Thunk實現Generator自動執(zhí)行的好處,業(yè)務場景如下: 假設小明今天干了一件事情是: ? ? ? ? 1、買菜 ? ? ? ? 2、買完菜回家

    2024年03月25日
    瀏覽(30)
  • JavaScript 生成器函數詳解:優(yōu)雅處理異步任務流

    目錄 1. 生成器函數的定義和使用 2. 暫停和恢復執(zhí)行 3. 與其他語言特性的配合使用 Iterator Protocol 迭代器協議? 解構賦值? 生成器和 Promise 的組合使用? ????????使用 Promise: ????????使用 async/await: 委托給另外一個Generator函數 ????????Generators 是 JavaScript 中的一種

    2024年02月12日
    瀏覽(20)
  • 構建Python隨機密碼生成器:保障賬戶安全的簡易工具

    構建Python隨機密碼生成器:保障賬戶安全的簡易工具

    ?? 個人網站:【 海擁】【神級代碼資源網站】【辦公神器】 ?? 基于Web端打造的:??輕量化工具創(chuàng)作平臺 ?? 想尋找共同學習交流的小伙伴,請點擊【全棧技術交流群】 密碼安全是當前數字時代的一個重要議題。在保護個人信息和賬戶安全方面,安全且可靠的密碼是至關重

    2024年02月03日
    瀏覽(25)
  • AI智能問答助手 AI智能批量文章生成器 網站優(yōu)化SEO批量內容生成工具 文章生成軟件

    AI智能問答助手 AI智能批量文章生成器 網站優(yōu)化SEO批量內容生成工具 文章生成軟件

    《AI智能問答助手》?? 軟件基于當下熱門的OpenAI的ChatGPT技術,導入問題列表就可以批量生成對應的內容,內容質量高、原創(chuàng)度高。適合對內容生成需求量大的場景,如網站優(yōu)化、廣告文案等等。。。 使用操作簡單、小白也能容易上手。 更多功能/: ab18cn ? ? OpenAI GPT是OpenA

    2024年02月08日
    瀏覽(34)
  • 手機通話記錄生成器在線,通話記錄生成器下載,通話記錄生成器app

    手機通話記錄生成器在線,通話記錄生成器下載,通話記錄生成器app

    在了解通話記錄生成器app的時候,鐵牛通話記錄生成器是一個為用戶一鍵自動生成通話記錄的app。如何得到“鐵牛通話記錄生成器”?在手機上進去佰渡baidu搜嗦,鐵牛通話記錄生成器,這幾個字就可以,其他的不用輸入?;蛘吣憧催@個幾個字母jp155再加上一個點com,手動輸入

    2024年02月08日
    瀏覽(110)
  • python3 生成器與生成器表達式

    在 Python3 中,生成器表達式是一種語言結構,它可以快速地創(chuàng)建一個可迭代對象。生成器表達式類似于列表推導式,但使用圓括號而不是方括號,并且返回的是一個生成器對象而不是一個列表。 在 Python3 中,生成器表達式有兩種類型:生成器函數和生成器表達式。 生成器函

    2024年02月02日
    瀏覽(94)
  • ai論文生成器哪家好用?ai寫作生成器免費

    ai論文生成器哪家好用?ai寫作生成器免費

    AI論文生成器的好壞取決于具體的需求和場景,因此很難一概而論。以下是一些常見的AI論文生成器,供您參考: AIPaperPass:這是一款全智能自動寫作平臺,擁有自主模型并對外開放API接口。它可以根據用戶提供的和要求,自動生成高質量的文章內容,并且支持批量寫作

    2024年01月19日
    瀏覽(111)
  • 關鍵詞生成器在線-在線免費關鍵詞生成器

    關鍵詞生成器在線-在線免費關鍵詞生成器

    生成,什么是生成,生成就是根據你輸入的一個生成成千上百的核心,圍繞著你輸入的核心詞來生成的,優(yōu)先生成大量用戶搜索的,今天就給大家分享一款免費生成工具,生成的來源主要是用戶都在搜索的詞,相關搜索的

    2024年02月04日
    瀏覽(108)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包