Более быстрый доступ к данным в JavaScript; цикл for и оператор if против глубоких многомерных массивов - PullRequest
1 голос
/ 10 июня 2011

Я строю структуру данных для хранения данных тайлов из изометрических карт. В настоящее время я использую многомерный массив с 3 осями.

var tile = tilesArray[X][Y][Z];

Мне интересно, будет ли быстрее использовать цикл for для поиска данных

tilesArray[i] = tileObject

function getTile(x, y, z) {

    //loop through the tiles till we find the right one
    for (var i = 0; i < tilesArray.length; i += 1) {

        //grab the tile
        var tile = tilesArray[i];

        //check the tile position to see if it is the one requested
        if (tile.position[0] = x && tile.position[1] = y && tile.position[2] = z) {
            return tile;
        }   
    }

    //if the tile is not found and we fall out of the for loop return false
    return false;
}

Итак, подведем итог

var tile = tilesArray[X][Y][Z];

против

var tile = getTile(x, y, z);

Ответы [ 5 ]

1 голос
/ 10 июня 2011

Если будет в основном произвольный доступ и много пробелов, вы можете инкапсулировать ассоциативный массив, похожий на этот

var store = {};

function setTile(x, y, z, tile) {
    k = x*1000000 + y*1000 + z;
    store["K" + k] = tile;
}

function getTile(x, y, z) {
    k = x*1000000 + y*1000 + z;
    return store["K" + k];
}

setTile(1, 7, 5, "1-7-5");
alert (getTile(1,7,5));

Это не так быстро, как многомерный массив, но он определенно быстрее, чем итерация и экономия пространства по сравнению с массивом.

Пример будет поддерживать индексы до 999, хотя

0 голосов
/ 10 июня 2011

Индексирование массива составляет ок. В 3 раза быстрее, используя тест ниже и выполняется в node.js (движок Google V8). Индексирует тот же элемент. Вы определенно хотите попробовать проиндексировать случайные элементы, чтобы лучше понять, как они сравниваются.

var tilesArray = createTileArray();

function createTileArray()
{
    var rank = 1000;
    var start = new Date();

    // Define
    var ar = new Array(3);

    // Create
    for (var i=0; i < 3; i++)
    {
        ar[i] = new Array(rank);

        for (var j=0; j < rank; j++)
        {
            ar[i][j] = new Array(rank);
        }
    }

    // Fill
    for ( var i = 0; i < 3; i++) {
        for ( var j = 0; j < rank; j++) {
            for ( var k = 0; k < rank; k++) {
                ar[i.valueOf()][j.valueOf()][k.valueOf()] = 3;
            }
        }
    }

    var end = new Date();

    console.log("Created array in: " + (end-start) + "ms");

    return ar;
}

function getTile(array, x, y, z) {

    // loop through the tiles till we find the right one
    for (var i = 0; i < array.length; i++) {

        // grab the tile
        var tile = array[i];

        // check the tile position to see if it is the one requested
        if (tile[0] === x && tile[1] === y && tile[2] === z) {
            return tile;
        }   
    }

    // if the tile is not found and we fall out of the for loop return false
    return false;
}

function arrayIndexing(array, loopCount)
{
    var start = new Date();

    for (var i = 0; i < loopCount; i++) {
        var elem = array[1][2][3];
    }

    var end = new Date();
    console.log("Array indexing in: " + (end-start) + "ms");
}

function loopIndexing(array, loopCount)
{
    var start = new Date();

    for (var i = 0; i < loopCount; i++) {
        getTile(array, 1, 2, 3);
    }

    var end = new Date();

    console.log("Loop indexing in: " + (end-start) + "ms");
}

var loopCount = 1000000;

arrayIndexing(tilesArray, loopCount);
loopIndexing(tilesArray, loopCount);
0 голосов
/ 10 июня 2011

Это зависит от типа доступа, который вы будете делать на самом деле.Это будет в основном вставки, а затем последовательный доступ?Тогда линейное хранилище, такое как связанный список с функцией доступа, может быть лучше.

Будет ли в основном индивидуальный произвольный доступ?тогда доступ к массиву определенно самый быстрый.

0 голосов
/ 10 июня 2011

Тест

Объект в 2/3 раза медленнее в Chrome 12.

Объект в 1000 медленнее в Firefox 4(По сути, массивы действительно быстрые в FF4, примерно в 1000 раз быстрее, чем chrome)

, потому что объект хорош и OO и не предполагает наличия трехмерного массива с LOT пробелов Я бы порекомендовал использовать его, так как это просто лучший способ хранения данных.

0 голосов
/ 10 июня 2011

Прямой доступ к массиву - самый быстрый, который вы можете получить на большинстве языков, я думаю, особенно по сравнению с вызовом цикла + функции. Без обид, но это звучит как плохая идея :) Оставь это как есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...