From 994d13df5a172e9188f92cecc1b6ef53d8f54ba9 Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Sat, 16 Jan 2016 11:32:19 -0800 Subject: [PATCH] A test script to confirm that the specified edit rate can be achieved for the specified number of objects. --- examples/tests/performance/staticEdits.js | 97 +++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 examples/tests/performance/staticEdits.js diff --git a/examples/tests/performance/staticEdits.js b/examples/tests/performance/staticEdits.js new file mode 100644 index 0000000000..61d75c9a9a --- /dev/null +++ b/examples/tests/performance/staticEdits.js @@ -0,0 +1,97 @@ +"use strict"; +/*jslint nomen: true, plusplus: true, vars: true*/ +var Entities, Script, print, Vec3, MyAvatar; +// +// Created by Howard Stearns +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// +// Creates a rectangular matrix of objects overhed, and edits them at EDIT_FREQUENCY_TARGET. +// Reports ms since last edit, ms to edit all the created entities, and average ms to edit one entity, +// so that you can measure how many edits can be made. +// +var LIFETIME = 15; +var EDIT_FREQUENCY_TARGET = 60; // hertz +var ROWS_X = 10; +var ROWS_Y = 1; +var ROWS_Z = 10; +var SEPARATION = 10.0; +var SIZE = 1.0; +// Note that when creating things quickly, the entity server will ignore data if we send updates too quickly. +// like Internet MTU, these rates are set by th domain operator, so in this script there is a RATE_PER_SECOND +// variable letting you set this speed. If entities are missing from the grid after a relog, this number +// being too high may be the reason. +var RATE_PER_SECOND = 600; // The entity server will drop data if we create things too fast. +var SCRIPT_INTERVAL = 100; + +var x = 0; +var y = 0; +var z = 0; +var o = Vec3.sum(MyAvatar.position, {x: ROWS_X * SEPARATION / -2, y: SEPARATION, z: ROWS_Z * SEPARATION / -2}); +var totalCreated = 0; +var startTime = new Date(); +var totalToCreate = ROWS_X * ROWS_Y * ROWS_Z; +print("Creating " + totalToCreate + " entities starting at " + startTime); + +var ids = [], colors = [], flasher, lastService = Date.now(); +function doFlash() { // One could call this in an interval timer, an update, or even a separate entity script. + var i, oldColor, newColor; + var start = Date.now(); + for (i = 0; i < ids.length; i++) { + oldColor = colors[i]; + newColor = {red: oldColor.green, green: oldColor.blue, blue: oldColor.red}; + colors[i] = newColor; + Entities.editEntity(ids[i], {color: newColor}); + } + var elapsed = Date.now() - start, serviceTime = start - lastService; + lastService = start; + print(serviceTime, elapsed, elapsed / totalCreated); // ms since last flash, ms to edit all entities, average ms to edit one entity +} +function stopFlash() { + Script.clearTimeout(flasher); + Script.stop(); +} +var creator = Script.setInterval(function () { + if (!Entities.serversExist() || !Entities.canRez()) { + return; + } + + var numToCreate = Math.min(RATE_PER_SECOND * (SCRIPT_INTERVAL / 1000.0), totalToCreate - totalCreated); + var i, properties; + for (i = 0; i < numToCreate; i++) { + properties = { + position: { x: o.x + SIZE + (x * SEPARATION), y: o.y + SIZE + (y * SEPARATION), z: o.z + SIZE + (z * SEPARATION) }, + name: "gridTest", + type: 'Box', + dimensions: {x: SIZE, y: SIZE, z: SIZE}, + ignoreCollisions: true, + collisionsWillMove: false, + lifetime: LIFETIME, + color: {red: x / ROWS_X * 255, green: y / ROWS_Y * 255, blue: z / ROWS_Z * 255} + }; + colors.push(properties.color); + ids.push(Entities.addEntity(properties)); + totalCreated++; + + x++; + if (x === ROWS_X) { + x = 0; + y++; + if (y === ROWS_Y) { + y = 0; + z++; + print("Created: " + totalCreated); + } + } + if (z === ROWS_Z) { + print("Total: " + totalCreated + " entities in " + ((new Date() - startTime) / 1000.0) + " seconds."); + Script.clearTimeout(creator); + flasher = Script.setInterval(doFlash, Math.ceil((1 / EDIT_FREQUENCY_TARGET) * 1000)); + Script.setTimeout(stopFlash, LIFETIME * 1000); + } + } +}, SCRIPT_INTERVAL); +Script.scriptEnding.connect(function () { Script.clearTimeout(flasher); }); +