javascript - الحصول على معلومات CPU / GPU / الذاكرة




memory webgl (4)

أنا بحاجة للحصول على أي معلومات حول وحدة المعالجة المركزية / GPU / memory.The عدد النوى ، وقيمة الذاكرة ، واستخدام الذاكرة و cpu ... لقد وجدت طريقة للقيام بذلك من أجل IE: كيفية استخدام JavaScript في البحث عن معلومات الأجهزة

حلول للمتصفحات الأخرى وأنا لا أعرف. أي فكرة كيف نفعل ذلك؟ ربما يمكن webgl الوصول إلى المعلومات حول جهاز الكمبيوتر الخاص بك؟ أو فلاش؟ أو أي تقنية أخرى؟

شكرا جزيلا


Answers

تدعم Chrome Canary حاليًا إرجاع عدد وحدات CPU الأساسية باستخدام:

navigator.hardwareConcurrency

لقد worked هذا بالنسبة لي في Chrome Canary 37.


سيقوم هذا الرمز بطباعة عناوين GPU المعلوماتية على قائمة بجميع المعلومات التي يمكنك الحصول عليها مع كائن الأداء لهذا المتصفح (لا يوجد معيار لـ BOM حتى يتغير لكل متصفح).

<html>

<body>
  <canvas id="glcanvas" width="0" height="0"></canvas>
  <script>
    var performance = window.performance || window.mozPerformance || window.msPerformance || window.webkitPerformance || {};

    document.write("<br>");
    for (var value in performance) {
      document.write(value + "<br>");
    }

    document.write("<br><br><br>");

    var canvas;
    canvas = document.getElementById("glcanvas");
    var gl = canvas.getContext("experimental-webgl");

    document.write(gl.getParameter(gl.RENDERER) + "<br>");
    document.write(gl.getParameter(gl.VENDOR) + "<br>");
    document.write(getUnmaskedInfo(gl).vendor + "<br>");
    document.write(getUnmaskedInfo(gl).renderer + "<br>");


    function getUnmaskedInfo(gl) {
      var unMaskedInfo = {
        renderer: '',
        vendor: ''
      };

      var dbgRenderInfo = gl.getExtension("WEBGL_debug_renderer_info");
      if (dbgRenderInfo != null) {
        unMaskedInfo.renderer = gl.getParameter(dbgRenderInfo.UNMASKED_RENDERER_WEBGL);
        unMaskedInfo.vendor = gl.getParameter(dbgRenderInfo.UNMASKED_VENDOR_WEBGL);
      }

      return unMaskedInfo;
    }
  </script>
</body>

الإخراج في Chrome:

onresourcetimingbufferfull
onwebkitresourcetimingbufferfull
timing
navigation
memory
now
getEntries
getEntriesByType
getEntriesByName
clearResourceTimings
setResourceTimingBufferSize
webkitClearResourceTimings
webkitSetResourceTimingBufferSize
mark
clearMarks
measure
clearMeasures
addEventListener
removeEventListener
dispatchEvent



WebKit WebGL
WebKit
NVIDIA Corporation
NVIDIA GeForce GTX 775M OpenGL Engine

الإخراج في Firfox:

now
getEntries
getEntriesByType
getEntriesByName
clearResourceTimings
setResourceTimingBufferSize
mark
clearMarks
measure
clearMeasures
toJSON
timing
navigation
onresourcetimingbufferfull



Mozilla
Mozilla

الإخراج في سفاري:

navigation
timing
now



WebKit WebGL
WebKit
NVIDIA Corporation
NVIDIA GeForce GTX 775M OpenGL Engine

لقد كتبت هذا البرنامج النصي السريع للحصول على سرعة المعالج:

var _speedconstant = 8.9997e-9; //if speed=(c*a)/t, then constant=(s*t)/a and time=(a*c)/s
var d = new Date();
var amount = 150000000;
var estprocessor = 1.7; //average processor speed, in GHZ
console.log("JSBenchmark by Aaron Becker, running loop "+amount+" times.     Estimated time (for "+estprocessor+"ghz processor) is "+(Math.round(((_speedconstant*amount)/estprocessor)*100)/100)+"s");
for (var i = amount; i>0; i--) {} 
var newd = new Date();
var accnewd = Number(String(newd.getSeconds())+"."+String(newd.getMilliseconds()));
var accd = Number(String(d.getSeconds())+"."+String(d.getMilliseconds())); 
var di = accnewd-accd;
//console.log(accnewd,accd,di);
if (d.getMinutes() != newd.getMinutes()) {
di = (60*(newd.getMinutes()-d.getMinutes()))+di}
spd = ((_speedconstant*amount)/di);
console.log("Time: "+Math.round(di*1000)/1000+"s, estimated speed: "+Math.round(spd*1000)/1000+"GHZ");

لاحظ أن هذا يعتمد على علامات تبويب المتصفح ، واستخدام الذاكرة ، وما إلى ذلك ، ولكنني وجدت أنها دقيقة جدًا إذا كنت تديرها مرة واحدة فقط ، على سبيل المثال عند تحميل الصفحة.

قد لا يكون ذلك دقيقًا لأجهزة الكمبيوتر المكتبية ، خاصة أجهزة الكمبيوتر ، ولكني استخدمها في موقعي على الويب فقط عندما تفشل حلول أخرى مثل الأولى ، للحصول على متوسط ​​سرعة الأجهزة المحمولة (يسمح لي بتقدير النوى المستخدمة) باستخدام جانب العميل فقط JS. قد لا يكون هذا هو الأفضل ، لكنه جيد.

إذا كنت ترغب في تغيير _speedconstant لتغيير السرعة ، فقم فقط بحسابه باستخدام المعادلة (knowncpuspeed * knowntimetocomplete) / knowncycles. آمل أن تجد هذه مفيدة!

UPDATE 10/19/17: تم تغيير _speedconstant لمحرك الكروم الجديد V8 JS والقسم المضاف حول ما أستخدمه من أجله.


إذا كانت مؤشرات الترابط لا تقوم بإجراء I / O ، أو المزامنة ، إلخ ، ولا يوجد شيء آخر قيد التشغيل ، فسوف تحصل على مؤشر ترابط لكل مركز على أفضل أداء. ومع ذلك من المرجح جدا ليس هذا هو الحال. تساعد إضافة مزيد من مؤشرات الترابط عادةً ، ولكن بعد نقطة ما ، فإنها تؤدي إلى بعض تدهور الأداء.

منذ وقت ليس ببعيد ، كنت أفعل اختبار الأداء على جهاز رباعي النواة يعمل على تطبيق ASP.NET على Mono تحت حمل لائق جدًا. لعبنا مع الحد الأدنى والحد الأقصى لعدد مؤشرات الترابط وفي النهاية اكتشفنا أنه بالنسبة لهذا التطبيق المعين في هذا التكوين الخاص ، كان أفضل معدل نقل بين 36 و 40 موضوعًا. أي شيء خارج تلك الحدود يؤدي أسوأ. الدرس المستفاد؟ إذا كنت أنت ، فسأختبر عددًا مختلفًا من سلاسل الرسائل حتى تعثر على الرقم الصحيح لطلبك.

شيء واحد مؤكد: سوف يستغرق وقتا أطول 4k المواضيع. هذا كثير من تبديل السياق.





javascript memory webgl cpu gpu