From ed79aa71af1aacf4756233eee6d5731a10949880 Mon Sep 17 00:00:00 2001 From: Aditya Gupta Date: Mon, 5 Dec 2022 12:18:23 +0000 Subject: [PATCH] added benchmark for rubidium performance tests scripts Test: Ran atest RubidiumPerfTests and verified all new added tests are successful Bug: 261463071 Change-Id: I2c0166533fb0ced3bf4cbd4c4a1c091f2a41123f --- apct-tests/perftests/rubidium/Android.bp | 1 + .../assets/rubidium_bidding_logic_compiled.js | 72 +++++ .../assets/rubidium_scoring_logic_compiled.js | 59 ++++ .../rubidium/js/JSScriptEnginePerfTests.java | 255 +++++++++++++++++- 4 files changed, 383 insertions(+), 4 deletions(-) create mode 100644 apct-tests/perftests/rubidium/assets/rubidium_bidding_logic_compiled.js create mode 100644 apct-tests/perftests/rubidium/assets/rubidium_scoring_logic_compiled.js diff --git a/apct-tests/perftests/rubidium/Android.bp b/apct-tests/perftests/rubidium/Android.bp index ba2b44241c5a9..ebd228f76a1d2 100644 --- a/apct-tests/perftests/rubidium/Android.bp +++ b/apct-tests/perftests/rubidium/Android.bp @@ -32,6 +32,7 @@ android_test { "collector-device-lib-platform", "compatibility-device-util-axt", "platform-test-annotations", + "framework-adservices-lib", "adservices-service-core", "androidx.core_core", ], diff --git a/apct-tests/perftests/rubidium/assets/rubidium_bidding_logic_compiled.js b/apct-tests/perftests/rubidium/assets/rubidium_bidding_logic_compiled.js new file mode 100644 index 0000000000000..3f853f1fd4d84 --- /dev/null +++ b/apct-tests/perftests/rubidium/assets/rubidium_bidding_logic_compiled.js @@ -0,0 +1,72 @@ +/* + + Copyright The Closure Library Authors. + SPDX-License-Identifier: Apache-2.0 +*/ +'use strict';function ba(a){var b=0;return function(){return b>>0)+"_",f=0;return b}); +m("Symbol.iterator",function(a){if(a)return a;a=Symbol("Symbol.iterator");for(var b="Array Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array".split(" "),c=0;cc&&(c=Math.max(c+f,0));c>2];h=b[(h&3)<<4|g>>4];g=b[(g&15)<<2|k>>6];k=b[k&63];c[e++]=l+h+g+k}l=0;k=d;switch(a.length-f){case 2:l=a[f+1],k=b[(l&15)<<2]||d;case 1:a=a[f],c[e]=b[a>>2]+b[(a&3)<<4|l>>4]+k+d}return c.join("")} +function Ca(a){var b=a.length,c=3*b/4;c%3?c=Math.floor(c):-1!="=.".indexOf(a[b-1])&&(c=-1!="=.".indexOf(a[b-2])?c-2:c-1);var d=new Uint8Array(c),f=0;Da(a,function(e){d[f++]=e});return f!==c?d.subarray(0,f):d} +function Da(a,b){function c(k){for(;d>4);64!=h&&(b(e<<4&240|h>>2),64!=g&&b(h<<6&192|g))}} +function Ba(){if(!za){za={};for(var a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(""),b=["+/=","+/","-_=","-_.","-_"],c=0;5>c;c++){var d=a.concat(b[c].split(""));ya[c]=d;for(var f=0;f=a.u?a.h?a.h[b]:void 0:c&&a.h&&(c=a.h[b],null!=c)?c:a.i[b+a.H]}function wb(a,b,c,d){ib(a);return y(a,b,c,d)}function y(a,b,c,d){a.V&&(a.V=void 0);if(b>=a.u||d)return vb(a)[b]=c,a;a.i[b+a.H]=c;(c=a.h)&&b in c&&delete c[b];return a} +function xb(a,b,c,d,f){var e=x(a,b,d);Array.isArray(e)||(e=gb);var h=v(e);h&1||$a(e);if(f)h&2||u(e,2),c&1||Object.freeze(e);else{f=!(c&2);var g=h&2;c&1||!g?f&&h&16&&!g&&Ua(e,16):(e=$a(Array.prototype.slice.call(e)),y(a,b,e,d))}return e}function yb(a,b){return xb(a,b,0,!1,w(a.i))} +function B(a,b,c,d){var f=w(a.i),e=xb(a,b,1,d,f),h=v(e);if(!(h&4)){Object.isFrozen(e)&&(e=$a(e.slice()),y(a,b,e,d));for(var g=0,k=0;g>=8);c[d++]=e}b=Aa(c,3);a=a(b);this.h("https://pagead2.googlesyndication.com/pagead/ping?e=3&d="+a)};function jc(a){V.call(this,a)}q(jc,V);function kc(a){V.call(this,a)}q(kc,V);function lc(a){V.call(this,a,-1,mc)}q(lc,V);var mc=[6];function nc(a){V.call(this,a,-1,oc)}q(nc,V);var oc=[2,3,4];function pc(a){V.call(this,a,-1,qc)}q(pc,V);var qc=[2];function rc(a){V.call(this,a,-1,sc)}q(rc,V);var sc=[1,3,10,7,8];function tc(a){V.call(this,a)}q(tc,V);function uc(a){V.call(this,a,-1,vc)}q(uc,V);var vc=[3];function wc(a){V.call(this,a,-1,xc)}q(wc,V);var xc=[3];function yc(a){V.call(this,a,-1,zc)}q(yc,V);var zc=[2,3,5];function Ac(a){V.call(this,a,-1,Bc)}q(Ac,V);function Cc(a){V.call(this,a,-1,Dc)}q(Cc,V);function Ec(a){V.call(this,a,-1,Fc)}q(Ec,V);var Bc=[1,2],Dc=[3,4,9],Fc=[3,4,5,6,7];function Gc(a){V.call(this,a,-1,Hc)}q(Gc,V);var Hc=[15];function Ic(a){V.call(this,a)}q(Ic,V);function Jc(a){V.call(this,a,-1,Kc)}q(Jc,V);var Kc=[1];function Lc(a){V.call(this,a)}q(Lc,V);function Mc(a){V.call(this,a)}q(Mc,V);function Nc(a){V.call(this,a,-1,Oc)}q(Nc,V);var Oc=[9,10,11,12,13,14,15,17];function Pc(a){V.call(this,a,-1,Qc)}q(Pc,V);var Qc=[1];function Zd(a){V.call(this,a)}q(Zd,V);function $d(a){V.call(this,a,-1,ae)}q($d,V);function W(a){return J(a,be,3)}function ce(a){V.call(this,a,-1,de)}q(ce,V);function ee(a){V.call(this,a)}q(ee,V);function be(a){V.call(this,a)}q(be,V);function fe(a){V.call(this,a)}q(fe,V);function ge(a){V.call(this,a)}q(ge,V);function he(a){var b=new ge;return G(b,1,a,0)}function ie(a){V.call(this,a,-1,je)}q(ie,V);function ke(a){V.call(this,a)}q(ke,V);var ae=[2],de=[1,2,3],je=[1,3];function le(a){V.call(this,a,-1,me)}q(le,V);var me=[10];function ne(a){a.sa.apply(a,ja(sa.apply(1,arguments).map(function(b){return{ta:9,message:b}})))};function oe(a,b){return!b||0>=b?a:Math.min(a,b)}function X(a,b,c){return b?b:c?c:a?1:0}function pe(a,b){return a&&0=b)return{j:0,B:2};var c=null==a?void 0:J(a,ie,18),d,f=null==a?void 0:null==(d=W(a))?void 0:J(d,ie,11);d=null==a?void 0:J(a,fe,7);if(!c&&!f){var e;f=null==a?void 0:null==(e=W(a))?void 0:J(e,fe,4);e=X(!0,null==d?void 0:S(d,1),null==f?void 0:S(f,1));a=X(!1,null==d?void 0:S(d,2),null==f?void 0:S(f,2));c=X(!1,null==d?void 0:S(d,3),null==f?void 0:S(f,3));var h,g;d=X(!1,null==d?void 0:null==(h=J(d,ge,5))?void 0:S(h,1),null==f?void 0:null==(g=J(f,ge,5))?void 0:S(g,1));h=new fe; +g=G(h,1,e,0);g=G(g,2,a,0);g=G(g,3,c,0);f=he(d);M(g,5,f);return{j:b*e*(1-1/(1+Math.exp(-a*(Math.log(b/1E6)-d-c)))),B:1,J:4,ba:h}}if(c||f){e=X(!1,null==c?void 0:S(c,2),null==f?void 0:S(f,2));a=pe(null==c?void 0:B(c,3,Number),null==f?void 0:B(f,3,Number));c=pe(null==c?void 0:yb(c,1),null==f?void 0:yb(f,1));h=[];g=p(c);for(f=g.next();!f.done;f=g.next())switch(f.value){case 1:h.push(1E-6*b);break;case 2:var k=f=void 0,l=null==(f=d)?void 0:null==(k=J(f,ge,5))?void 0:S(k,1);h.push("number"===typeof l?Math.exp(l): +0)}d=se(a,h);1===d.B?(b=new ie,b=zb(b,3,a),b=zb(b,1,c),b=G(b,2,e,0),d.ba=b,b=d):b=0>=e||1a[0])return{j:0,B:5};var c=b.length;if(a.length!==1+2*(1+c))return{j:0,B:6};for(var d=c+2,f=a[1],e=a[d],h=0;h=b[h]){if(1E-9>Math.abs(a[1+g])&&1E-9>Math.abs(a[d+g]))continue;return{j:0,B:4}}var k=Math.log(b[h]);f+=a[1+g]*k;e+=a[d+g]*k}return{j:1E9*Math.exp(-.5*(-(f+e)+Math.sqrt((f-e)*(f-e)+4*a[0]))),B:1,J:8}};function te(a,b){var c=null==a?void 0:J(a,fe,6),d,f=null==a?void 0:null==(d=W(a))?void 0:J(d,fe,3);if(!b||0>=b)return{j:0,J:1};if(1===(null==a?void 0:T(a,17)))return{j:b,J:2};var e;if(!(null==a?0:null==(e=W(a))?0:R(e,2)))return{j:.85*b,J:2};d=X(!0,null==c?void 0:S(c,4),null==f?void 0:S(f,4));e=X(!0,null==c?void 0:S(c,1),null==f?void 0:S(f,1));var h=X(!1,null==c?void 0:S(c,2),null==f?void 0:S(f,2)),g=X(!1,null==c?void 0:S(c,3),null==f?void 0:S(f,3)),k,l,n=X(!1,null==c?void 0:null==(k=J(c,ge,5))?void 0: +S(k,1),null==f?void 0:null==(l=J(f,ge,5))?void 0:S(l,1));l=X(!1,null==c?void 0:S(c,9),null==f?void 0:S(f,9));k=new fe;var t=G(k,1,e,0);t=G(t,2,h,0);t=G(t,3,g,0);t=G(t,4,d,0);t=G(t,9,l,0);var I=he(n);M(t,5,I);t=3;d=d*b*e*(1-1/(1+Math.exp(-h*(Math.log(d*b/1E6)-n-g))));d=g.length||0!==(g[h]>>>e%32)%2)){d=!1;break}}if(d)return!0}return b} +function ze(a,b){var c=E(b,1),d=K(b,tc,3),f=K(b,yc,2);switch(c){case 2:c=d.every(function(e){return Be(a,e)})&&f.every(function(e){return ze(a,e)});break;case 1:c=d.some(function(e){return Be(a,e)})||f.some(function(e){return ze(a,e)});break;default:throw Error("unexpected value "+c+"!");}return R(b,4)?!c:c}function ye(a){this.h=new Map;a=p(K(a,tc,5));for(var b=a.next();!b.done;b=a.next()){var c=b.value;b=P(x(c,1),0);c=P(x(c,2),0);var d=this.h.get(b);d||(d=new Set,this.h.set(b,d));d.add(c)}} +function Be(a,b){var c=P(x(b,2),0);return(a=a.h.get(P(x(b,1),0)))?a.has(c):!1};function Ce(a,b){a=p((null==b?void 0:b.get(a))||[]);for(b=a.next();!b.done;b=a.next())if(b=b.value,b.count+1>b.ra)return!1;return!0};function De(a){a=a.split("!");for(var b="-1",c=0;cO.j?(c=A,c.I=F.j):(c=d,c.I=O.j)}if(b)for(a=p(a.ads),h=a.next();!h.done;h=a.next())ea=h.value,Te(b,ea,Se(ea.D,ea.G,ea.L)===Se(c.D,c.G,c.L)?1:9,4);return{ha:{ad:{},bid:c.I/1E6,render:c.renderUrl,allowComponentAuction:!0},debugInfo:void 0}}function Se(a,b,c){return a.concat("+",b,"+",c)};function Ve(a,b,c,d,f){a={renderUrl:a.render_uri,metadata:a.metadata.metadata};f={owner:f.owner,name:f.name,biddingLogicUrl:"",userBiddingSignals:f.user_bidding_signals.signals,ads:[a]};a={topWindowHostname:"",seller:"",joinCount:0,bidCount:0,prevWins:[[0,a]]};b=Pe()(f,b,c.signals,d,a);c="";"string"===typeof b.render?c=b.render:(d=b.render,0>>0)+"_",f=0;return b}); +n("Symbol.iterator",function(a){if(a)return a;a=Symbol("Symbol.iterator");for(var b="Array Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array".split(" "),c=0;cc&&(c=Math.max(c+f,0));c>2];g=b[(g&3)<<4|h>>4];h=b[(h&15)<<2|k>>6];k=b[k&63];c[e++]=l+g+h+k}l=0;k=d;switch(a.length-f){case 2:l=a[f+1],k=b[(l&15)<<2]||d;case 1:a=a[f],c[e]=b[a>>2]+b[(a&3)<<4|l>>4]+k+d}return c.join("")} +function wa(a){var b=a.length,c=3*b/4;c%3?c=Math.floor(c):-1!="=.".indexOf(a[b-1])&&(c=-1!="=.".indexOf(a[b-2])?c-2:c-1);var d=new Uint8Array(c),f=0;xa(a,function(e){d[f++]=e});return f!==c?d.subarray(0,f):d} +function xa(a,b){function c(k){for(;d>4);64!=g&&(b(e<<4&240|g>>2),64!=h&&b(g<<6&192|h))}} +function va(){if(!u){u={};for(var a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(""),b=["+/=","+/","-_=","-_.","-_"],c=0;5>c;c++){var d=a.concat(b[c].split(""));ta[c]=d;for(var f=0;f=a.i?a.h?a.h[b]:void 0:c&&a.h&&(c=a.h[b],null!=c)?c:a.j[b+a.A]}function M(a,b,c,d){a.o&&(a.o=void 0);if(b>=a.i||d)return Ya(a)[b]=c,a;a.j[b+a.A]=c;(c=a.h)&&b in c&&delete c[b];return a} +function Za(a,b,c,d,f){var e=L(a,b,d);Array.isArray(e)||(e=I);var g=A(e);g&1||C(e);if(f)g&2||z(e,2),c&1||Object.freeze(e);else{f=!(c&2);var h=g&2;c&1||!h?f&&g&16&&!h&&Ea(e,16):(e=C(Array.prototype.slice.call(e)),M(a,b,e,d))}return e}function O(a,b){return Za(a,b,0,!1,E(a.j))} +function P(a,b,c,d){var f=E(a.j),e=Za(a,b,1,d,f),g=A(e);if(!(g&4)){Object.isFrozen(e)&&(e=C(e.slice()),M(a,b,e,d));for(var h=0,k=0;h>=8);c[d++]=e}b=ua(c,3);a=a(b);this.h("https://pagead2.googlesyndication.com/pagead/ping?e=3&d="+a)};function rb(a){X.call(this,a)}r(rb,X);function sb(a){X.call(this,a,-1,tb)}r(sb,X);var tb=[3];function ub(a){X.call(this,a,-1,vb)}r(ub,X);var vb=[3];function wb(a){X.call(this,a,-1,xb)}r(wb,X);var xb=[2,3,5];function yb(a){X.call(this,a,-1,zb)}r(yb,X);function Ab(a){X.call(this,a,-1,Bb)}r(Ab,X);function Cb(a){X.call(this,a,-1,Db)}r(Cb,X);var zb=[1,2],Bb=[3,4,9],Db=[3,4,5,6,7];function Y(a){X.call(this,a)}r(Y,X);function Eb(a){X.call(this,a,-1,Fb)}r(Eb,X);var Fb=[1,2,3];function Gb(a){X.call(this,a,-1,Hb)}r(Gb,X);var Hb=[1];function Ib(a){X.call(this,a,-1,Jb)}r(Ib,X);var Jb=[1];function Kb(a){X.call(this,a,-1,Lb)}r(Kb,X);var Lb=[1];function Mb(a){X.call(this,a,-1,Nb)}r(Mb,X);var Nb=[1];function Z(a){X.call(this,a)}r(Z,X);function Ob(a){X.call(this,a,-1,Pb)}r(Ob,X);function Qb(a){X.call(this,a)}r(Qb,X);var Pb=[1];function Rb(a){X.call(this,a)}r(Rb,X);function Sb(a){X.call(this,a)}r(Sb,X);function Tb(a){X.call(this,a)}r(Tb,X);function Ub(a){X.call(this,a)}r(Ub,X);function Vb(a){X.call(this,a,-1,Wb)}r(Vb,X);var Wb=[1];function Xb(a){X.call(this,a,-1,Yb)}r(Xb,X);var Yb=[1,2];function Zb(a){X.call(this,a,-1,$b)}r(Zb,X);var $b=[1];function ac(a){X.call(this,a,-1,bc)}r(ac,X);var bc=[2,3,6,10];function cc(a){X.call(this,a)}r(cc,X);function dc(a,b){return R(a,1,b,"")}function ec(a,b){return fb(a,2,b)};var fc={ja:0,V:1,X:2,ca:3,Z:4,Y:5,aa:6,ba:7,da:8,ea:12,U:9,N:10,W:11};var gc={ka:0,ha:1,S:2,T:3,fa:4,M:5,ia:6,ga:7,P:8,O:9,R:10};function hc(a){X.call(this,a,-1,ic)}r(hc,X);function jc(a,b){fb(a,8,b)}function kc(a){X.call(this,a,-1,lc)}r(kc,X);function mc(a,b){return R(a,2,b,"")}function nc(a,b){return R(a,3,b,"")}var ic=[9],lc=[6];function oc(a){a.K.apply(a,ha(oa.apply(1,arguments).map(function(b){return{L:10,message:b}})))};function pc(a){X.call(this,a,-1,qc)}r(pc,X);var qc=[1];function rc(a,b,c){if(Q(a,2)!==Q(b,2))return c;var d=!1;switch(Q(a,2)){case 1:a:{var f,e=new Set(null!=(f=O(a,3))?f:[]);b=p(O(b,3));for(f=b.next();!f.done;f=b.next())if(e.has(f.value)){d=!0;break a}d=!1}break;case 0:a:{f=new Set(null!=(e=P(a,4,Na,!1))?e:[]);b=p(P(b,4,Na,!1));for(e=b.next();!e.done;e=b.next())if(f.has(e.value)){d=!0;break a}d=!1}break;case 2:b=new sc(b);d=(f=T(a,wb,5))?tc(b,f):!1;break;case 3:a:{f=new Set;e=p(P(a,9,$a));for(d=e.next();!d.done;d=e.next())f.add(Da(d.value));if(0===f.size)d= +!0;else{b=p(P(b,6,$a));for(e=b.next();!e.done;e=b.next())if(f.has(Da(e.value))){d=!0;break a}d=!1}}break;case 4:d=uc(a,b)}return W(a,6)?d?null:c:d?c:null} +function uc(a,b){a=T(a,sb,10);if(void 0===a)return!1;var c=U(b,ub,7);if(0===c.length)return!1;b=!0;c=p(c);for(var d=c.next();!d.done;d=c.next())if(d=d.value,V(L(d,1),0)===V(L(a,1),0)&&V(L(d,2),0)===V(L(a,2),0)){b&&(b=!1);var f=O(d,3);if(0===f.length)return!1;d=!0;f=p(f);for(var e=f.next();!e.done;e=f.next()){e=e.value;var g=Math.floor(e/32),h=O(a,3);if(!(g>=h.length||0!==(h[g]>>>e%32)%2)){d=!1;break}}if(d)return!0}return b} +function tc(a,b){var c=Q(b,1),d=U(b,rb,3),f=U(b,wb,2);switch(c){case 2:c=d.every(function(e){return vc(a,e)})&&f.every(function(e){return tc(a,e)});break;case 1:c=d.some(function(e){return vc(a,e)})||f.some(function(e){return tc(a,e)});break;default:throw Error("unexpected value "+c+"!");}return W(b,4)?!c:c}function sc(a){this.h=new Map;a=p(U(a,rb,5));for(var b=a.next();!b.done;b=a.next()){var c=b.value;b=V(L(c,1),0);c=V(L(c,2),0);var d=this.h.get(b);d||(d=new Set,this.h.set(b,d));d.add(c)}} +function vc(a,b){var c=V(L(b,2),0);return(a=a.h.get(V(L(b,1),0)))?a.has(c):!1};function wc(a,b){switch(a){case 2:return 187;case 3:return 138;case 4:return xc(b);case 5:return 80;case 6:return 7;case 7:return 2;case 8:return 7;default:return 4}}function xc(a){switch(a){case 2:return 12;case 3:return 14;case 4:return 15;case 5:return 219;case 6:return 82;case 7:return 80;case 8:return 71;case 9:return 16;default:return 4}};function yc(a){return"https://googleads.g.doubleclick.net"===a||"https://td.doubleclick.net"===a};function zc(a,b,c,d,f){this.J=a;this.postRevshareBidCpmUsdMicros=b;this.sellerSignals=c;this.h=d;this.D=f;this.o=new Map;if(W(S(c,Y,12),1)||W(S(c,Y,12),2))a=new hc,this.i=R(a,7,V(L(this.sellerSignals,2),""),"")}zc.prototype.reject=function(a,b){b=void 0===b?0:b;var c,d,f,e,g={ru:null!=(f=null==(c=this.h)?void 0:c.renderUrl)?f:"",igo:null!=(e=null==(d=this.h)?void 0:d.interestGroupOwner)?e:"",s:a,r:b};Ac(this,a,b);return{desirability:0,postRevshareBidCpmUsdMicros:0,debugInfo:this.D?g:void 0,debugEventMessage:this.debugEventMessage}}; +zc.prototype.accept=function(){var a,b,c,d,f={ru:null!=(c=null==(a=this.h)?void 0:a.renderUrl)?c:"",igo:null!=(d=null==(b=this.h)?void 0:b.interestGroupOwner)?d:"",s:1,r:1};Ac(this,1,1);return{desirability:this.postRevshareBidCpmUsdMicros,postRevshareBidCpmUsdMicros:this.postRevshareBidCpmUsdMicros,debugInfo:this.D?f:void 0,debugEventMessage:this.debugEventMessage}}; +function Ac(a,b,c){if(void 0!==a.i){var d=nc(mc(new kc,a.h.interestGroupOwner),a.h.renderUrl);yc(a.h.interestGroupOwner)||R(d,8,a.J,0);fb(a.i,4,d);W(S(a.sellerSignals,Y,12),5)&&(jc(fb(a.i,11,a.sellerSignals),ec(dc(new cc,a.h.renderUrl),a.I)),a.o.forEach(function(h,k){var l;null!=(l=a.i)&&(k=ec(dc(new cc,k),h),J(l),h=eb(l,cc,9,void 0,!1,!1),k=null!=k?k:new cc,l=Za(l,9,2,void 0,!1),h.push(k),l.push(k.j),E(k.j)&&Ea(l,8))}));if(Object.values(gc).includes(b)){var f;null!=(f=a.i)&&R(f,6,b,0)}if(Object.values(fc).includes(c)){var e; +null!=(e=a.i)&&R(e,5,c,0)}if(1!==b||1!==c){var g;null!=(g=a.i)&&R(g,10,wc(b,c),0)}}}ea.Object.defineProperties(zc.prototype,{debugEventMessage:{configurable:!0,enumerable:!0,get:function(){var a;return null==(a=this.i)?void 0:Wa(a)}}});function Bc(a){var b;this.i=null!=(b=null==a?void 0:V(L(a,4),0))?b:0}Bc.prototype.h=function(a){if(!this.i)return 1;var b;return(null==(b=T(a,Vb,9))?0:O(b,1).includes(this.i))?2:1};function Cc(a,b){return 0===a.size?!1:void 0===b||0===b.length?!0:b.some(function(c){return a.has(c)})}function Dc(a){a=S(S(a,Z,2),Eb,1);this.i=new Set(O(a,1));this.o=W(a,4);this.D=W(a,5)}Dc.prototype.h=function(a){var b;if(Cc(this.i,null==(b=T(a,Xb,1))?void 0:O(b,1)))return 4;a=T(a,Xb,1);return!this.D||a&&!W(a,4)?!this.o||a&&!W(a,3)?1:3:4};function Ec(a){this.i=W(S(S(a,Z,2),Gb,3),2);this.o=new Set(O(S(S(a,Z,2),Gb,3),1))}Ec.prototype.h=function(a){var b=this;return this.i?1:void 0===bb(a,Zb,7,!1)||O(T(a,Zb,7),1).every(function(c){return b.o.has(c)})?1:5};function Fc(a){var b,c,d;this.i=new Set(null!=(d=null==a?void 0:null==(b=T(a,Z,2))?void 0:null==(c=T(b,Ib,4))?void 0:P(c,1,Na,!1))?d:[])}Fc.prototype.h=function(a){var b=this;return 0===this.i.size?1:0===P(a,10,Na,!1).length||P(a,10,Na,!1).some(function(c){return!b.i.has(c)})?6:1};function Gc(a){var b,c;this.i=null!=(c=null==a?void 0:null==(b=T(a,Ob,3))?void 0:U(b,Qb,1))?c:[]}Gc.prototype.h=function(a,b){if(null==b)return 7;if(0===this.i.length)return 1;a=p(this.i);for(var c=a.next();!c.done;c=a.next())if(c=c.value,null!=V(L(c,2),0)&&bb)return a.reject(3);if(e)return a.accept();if(!d.renderUrl)return a.reject(7,11);e=null==c?void 0:c.renderUrl;if(null== +e||!e[d.renderUrl])return a.reject(6,10);var m;e=new ac(ob(null!=(m=null==e?void 0:e[d.renderUrl])?m:[]));a.I=e;m=Mc(a,a.I);if(1!==m.B)return a.reject(m.G,m.B);var q;if(null==(q=d.adComponents)?0:q.length){q=!1;d=p(d.adComponents);for(m=d.next();!m.done;m=d.next())if(m=m.value,l=g=e=void 0,b=null!=(l=null==(e=c)?void 0:null==(g=e.adComponentRenderUrls)?void 0:g[m])?l:[],e=ob(b),e.length&&(q=!0,e=new ac(e),a.o.set(m,e),e=Mc(a,e),1!==e.B))return c=a.reject(e.G,e.B),c.debugInfo&&(c.debugInfo.acru=m), +c;if(!q)return a.reject(8,12)}return a.accept()};function Nc(a,b,c,d,f){var e=a.metadata.metadata;c={seller:c.seller,decisionLogicUrl:c.decision_logic_uri,trustedScoringSignalsUrl:c.trusted_scoring_signal_uri,interestGroupBuyers:c.custom_audience_buyers,auctionSignals:f,sellerExperimentGroupId:void 0,sellerSignals:d.signals,perBuyerSignals:c.per_buyer_signals};a={topWindowHostname:"",interestGroupOwner:"",renderUrl:a.render_uri,biddingDurationMsec:0};b=Jc()(e,b,c,f,a);return{status:0,score:"number"===typeof b?b:b.desirability}};var Oc=globalThis;Oc.scoreAd=function(a,b,c,d,f){return Nc(a,b,c,d,f)};Oc.scoreAdIterative=function(a,b,c,d){var f=[],e=(new Date).getTime();a=p(a);for(var g=a.next();!g.done;g=a.next())g=g.value,g=Nc(g.ad,g.bid,b,c,d),f.push(g);return{responses:f,status:0,duration:(new Date).getTime()-e}}; diff --git a/apct-tests/perftests/rubidium/src/android/rubidium/js/JSScriptEnginePerfTests.java b/apct-tests/perftests/rubidium/src/android/rubidium/js/JSScriptEnginePerfTests.java index 33b2bea1da666..0b351013d23ab 100644 --- a/apct-tests/perftests/rubidium/src/android/rubidium/js/JSScriptEnginePerfTests.java +++ b/apct-tests/perftests/rubidium/src/android/rubidium/js/JSScriptEnginePerfTests.java @@ -17,6 +17,7 @@ package android.rubidium.js; import static com.android.adservices.service.js.JSScriptArgument.arrayArg; +import static com.android.adservices.service.js.JSScriptArgument.jsonArg; import static com.android.adservices.service.js.JSScriptArgument.numericArg; import static com.android.adservices.service.js.JSScriptArgument.recordArg; import static com.android.adservices.service.js.JSScriptArgument.stringArg; @@ -26,8 +27,14 @@ import static com.google.common.truth.Truth.assertThat; import static org.junit.Assume.assumeTrue; +import android.adservices.adselection.AdSelectionConfig; +import android.adservices.adselection.AdWithBid; +import android.adservices.common.AdData; +import android.adservices.common.AdSelectionSignals; +import android.adservices.common.AdTechIdentifier; import android.annotation.SuppressLint; import android.content.Context; +import android.net.Uri; import android.perftests.utils.BenchmarkState; import android.perftests.utils.PerfStatusReporter; import android.util.Log; @@ -37,6 +44,12 @@ import androidx.test.core.app.ApplicationProvider; import androidx.test.filters.MediumTest; import androidx.test.runner.AndroidJUnit4; +import com.android.adservices.data.adselection.CustomAudienceSignals; +import com.android.adservices.service.adselection.AdDataArgument; +import com.android.adservices.service.adselection.AdSelectionConfigArgument; +import com.android.adservices.service.adselection.AdWithBidArgument; +import com.android.adservices.service.adselection.CustomAudienceBiddingSignalsArgument; +import com.android.adservices.service.adselection.CustomAudienceScoringSignalsArgument; import com.android.adservices.service.js.IsolateSettings; import com.android.adservices.service.js.JSScriptArgument; import com.android.adservices.service.js.JSScriptArrayArgument; @@ -46,9 +59,11 @@ import com.android.adservices.service.profiling.JSScriptEngineLogConstants; import com.android.adservices.service.profiling.Profiler; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.google.common.util.concurrent.ListenableFuture; import org.json.JSONArray; +import org.json.JSONObject; import org.junit.After; import org.junit.Before; import org.junit.Rule; @@ -58,14 +73,23 @@ import org.junit.runner.RunWith; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; +import java.time.Clock; +import java.time.Duration; +import java.time.Instant; +import java.time.ZoneOffset; +import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Locale; +import java.util.Map; import java.util.Objects; import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.IntStream; /** To run the unit tests for this class, run "atest RubidiumPerfTests:JSScriptEnginePerfTests" */ @MediumTest @@ -78,8 +102,12 @@ public class JSScriptEnginePerfTests { private static final JSScriptEngine sJSScriptEngine = JSScriptEngine.getInstanceForTesting( sContext, Profiler.createInstance(JSScriptEngine.TAG)); - - @Rule public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); + private static final Clock CLOCK = Clock.fixed(Instant.now(), ZoneOffset.UTC); + private static final Instant ACTIVATION_TIME = CLOCK.instant(); + private static final Instant EXPIRATION_TIME = CLOCK.instant().plus(Duration.ofDays(1)); + private static final AdSelectionSignals CONTEXTUAL_SIGNALS = AdSelectionSignals.EMPTY; + @Rule + public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter(); @Before public void before() throws Exception { @@ -162,6 +190,56 @@ public class JSScriptEnginePerfTests { runParametrizedTurtledoveScript(75); } + @Test + public void evaluate_rubidiumGenerateBid_parametrized_1Ad() throws Exception { + runParameterizedRubidiumGenerateBid(1); + } + + @Test + public void evaluate_rubidiumGenerateBid_parametrized_10Ads() throws Exception { + runParameterizedRubidiumGenerateBid(10); + } + + @Test + public void evaluate_rubidiumGenerateBid_parametrized_25Ads() throws Exception { + runParameterizedRubidiumGenerateBid(25); + } + + @Test + public void evaluate_rubidiumGenerateBid_parametrized_50Ads() throws Exception { + runParameterizedRubidiumGenerateBid(50); + } + + @Test + public void evaluate_rubidiumGenerateBid_parametrized_75Ads() throws Exception { + runParameterizedRubidiumGenerateBid(75); + } + + @Test + public void evaluate_rubidiumScoreAd_parametrized_1Ad() throws Exception { + runParameterizedRubidiumScoreAd(1); + } + + @Test + public void evaluate_rubidiumScoreAd_parametrized_10Ads() throws Exception { + runParameterizedRubidiumScoreAd(10); + } + + @Test + public void evaluate_rubidiumScoreAd_parametrized_25Ads() throws Exception { + runParameterizedRubidiumScoreAd(25); + } + + @Test + public void evaluate_rubidiumScoreAd_parametrized_50Ads() throws Exception { + runParameterizedRubidiumScoreAd(50); + } + + @Test + public void evaluate_rubidiumScoreAd_parametrized_75Ads() throws Exception { + runParameterizedRubidiumScoreAd(75); + } + @SuppressLint("DefaultLocale") private void runParametrizedTurtledoveScript(int numAds) throws Exception { BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); @@ -190,7 +268,7 @@ public class JSScriptEnginePerfTests { "(%s: %d)", JSScriptEngineLogConstants.WEBVIEW_EXECUTION_TIME, webviewExecTime); // The listener picks up logs from JSScriptEngine, so simulate logging from there. - Log.d("JSScriptEngine", webviewExecTimeLog); + Log.d(TAG, webviewExecTimeLog); } } @@ -202,7 +280,9 @@ public class JSScriptEnginePerfTests { ImmutableList.of( stringArg( "renderUrl", - "https://googleads.g.doubleclick.net/ads/simple-ad.html?adg_id=52836427830&cr_id=310927197297&cv_id=4"), + "https://googleads.g.doubleclick.net/ads/simple-ad" + + ".html?adg_id=52836427830&cr_id=310927197297" + + "&cv_id=4"), stringArrayArg( "metadata", ImmutableList.of( @@ -350,4 +430,171 @@ public class JSScriptEnginePerfTests { private String readAsset(@NonNull String assetName) throws IOException { return new String(readBinaryAsset(assetName), StandardCharsets.UTF_8); } + + public void runParameterizedRubidiumGenerateBid(int numOfAds) throws Exception { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + state.pauseTiming(); + List adDataList = getSampleAdDataList(numOfAds, "https://ads.example/"); + ImmutableList.Builder adDataListArgument = new ImmutableList.Builder<>(); + for (AdData adData : adDataList) { + adDataListArgument.add(AdDataArgument.asScriptArgument("ignored", adData)); + } + AdSelectionSignals perBuyerSignals = generatePerBuyerSignals(numOfAds); + AdSelectionSignals auctionSignals = AdSelectionSignals.fromString("{\"auctionSignal1" + + "\":\"auctionValue1\",\"auctionSignal2\":\"auctionValue2\"}"); + + AdTechIdentifier buyer = AdTechIdentifier.fromString("https://example-dsp.com"); + AdSelectionSignals trustedBiddingSignals = AdSelectionSignals.fromString("{\"key1" + + "\":\"tbs1\",\"key2\":{}}"); + CustomAudienceSignals customAudienceSignals = getSampleCustomAudienceSignals(buyer, + "shoes-running"); + + ImmutableList args = ImmutableList.builder() + .add(arrayArg("ads", adDataListArgument.build())) + .add(jsonArg("auctionSignals", auctionSignals)) + .add(jsonArg("perBuyerSignals", perBuyerSignals)) + .add(jsonArg("trustedBiddingSignals", trustedBiddingSignals)) + .add(jsonArg("contextualSignals", CONTEXTUAL_SIGNALS)) + .add(CustomAudienceBiddingSignalsArgument.asScriptArgument( + "customAudienceBiddingSignal", customAudienceSignals)) + .build(); + InputStream testJsInputStream = sContext.getAssets().open( + "rubidium_bidding_logic_compiled.js"); + String jsTestFile = new String(testJsInputStream.readAllBytes(), StandardCharsets.UTF_8); + //logging time taken to call JS + state.resumeTiming(); + while (state.keepRunning()) { + String res = callJSEngine(jsTestFile, args, "generateBidIterative"); + JSONObject jsonObject = new JSONObject(res); + long webviewExecTime = jsonObject.getLong("duration"); + String webviewExecTimeLog = + String.format(Locale.ENGLISH, + "(%s: %d)", + JSScriptEngineLogConstants.WEBVIEW_EXECUTION_TIME, + webviewExecTime); + // The listener picks up logs from JSScriptEngine, so simulate logging from there. + Log.d(TAG, webviewExecTimeLog); + } + } + + public void runParameterizedRubidiumScoreAd(int numOfAds) throws Exception { + BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + state.pauseTiming(); + String adRenderUrl = "https://rtb.example/creative"; + List adWithBidList = getSampleAdDataWithBidList(numOfAds, adRenderUrl); + ImmutableList.Builder adWithBidArrayArgument = + new ImmutableList.Builder<>(); + for (AdWithBid adWithBid : adWithBidList) { + adWithBidArrayArgument.add(AdWithBidArgument.asScriptArgument("adWithBid", adWithBid)); + } + AdTechIdentifier seller = AdTechIdentifier.fromString("www.example-ssp.com"); + AdSelectionSignals sellerSignals = AdSelectionSignals.fromString("{\"signals\":[]}"); + String trustedScoringSignalJson = String.format(Locale.ENGLISH, + "{\"renderUrl\":{\"%s\":[]}}", adRenderUrl); + AdSelectionSignals trustedScoringSignalsJson = AdSelectionSignals.fromString( + trustedScoringSignalJson); + + AdTechIdentifier buyer1 = AdTechIdentifier.fromString("https://example-dsp.com"); + AdSelectionSignals buyer1Signals = AdSelectionSignals.fromString("{\"https://example-dsp" + + ".com:1\":\"value1\",\"https://example-dsp.com:2\":\"value2\"}"); + Map perBuyerSignals = ImmutableMap.of(buyer1, + buyer1Signals); + + AdSelectionConfig adSelectionConfig = getSampleAdSelectionConfig(seller, sellerSignals, + perBuyerSignals); + CustomAudienceSignals customAudienceSignals = getSampleCustomAudienceSignals(buyer1, + "shoes-running"); + + ImmutableList args = ImmutableList.builder() + .add(arrayArg("adsWithBids", adWithBidArrayArgument.build())) + .add(AdSelectionConfigArgument.asScriptArgument(adSelectionConfig, + "adSelectionConfig")) + .add(jsonArg("sellerSignals", sellerSignals)) + .add(jsonArg("trustedScoringSignals", trustedScoringSignalsJson)) + .add(jsonArg("contextualSignals", CONTEXTUAL_SIGNALS)) + .add(CustomAudienceScoringSignalsArgument.asScriptArgument( + "customAudienceScoringSignal", customAudienceSignals)) + .build(); + InputStream testJsInputStream = sContext.getAssets().open( + "rubidium_scoring_logic_compiled.js"); + String jsTestFile = new String(testJsInputStream.readAllBytes(), StandardCharsets.UTF_8); + //logging time taken to call JS + state.resumeTiming(); + while (state.keepRunning()) { + String res = callJSEngine(jsTestFile, args, "scoreAdIterative"); + JSONObject jsonObject = new JSONObject(res); + long webviewExecTime = jsonObject.getLong("duration"); + String webviewExecTimeLog = + String.format(Locale.ENGLISH, + "(%s: %d)", + JSScriptEngineLogConstants.WEBVIEW_EXECUTION_TIME, + webviewExecTime); + // The listener picks up logs from JSScriptEngine, so simulate logging from there. + Log.d(TAG, webviewExecTimeLog); + } + } + + private List getSampleAdDataWithBidList(int size, String baseUri) { + double initialBid = 1.23; + return IntStream.rangeClosed(1, size).mapToObj(iterator -> { + Uri renderUri = Uri.parse(String.format(Locale.ENGLISH, "%s%d", baseUri, iterator)); + String metaDataJson = String.format(Locale.ENGLISH, "{\"metadata\":[\"%d\",\"123\"]}", + iterator); + AdData adData = new AdData.Builder().setRenderUri(renderUri).setMetadata( + metaDataJson).build(); + return new AdWithBid(adData, initialBid + iterator); + }).collect(Collectors.toCollection(ArrayList::new)); + } + + private List getSampleAdDataList(int size, String baseUri) { + return IntStream.rangeClosed(1, size).mapToObj(iterator -> { + Uri renderUri = Uri.parse(String.format(Locale.ENGLISH, "%s%d", baseUri, iterator)); + String metaDataJson = String.format(Locale.ENGLISH, "{\"metadata\":[\"%d\",\"123\"]}", + iterator); + return new AdData.Builder().setRenderUri(renderUri).setMetadata( + metaDataJson).build(); + }).collect(Collectors.toCollection(ArrayList::new)); + } + + private CustomAudienceSignals getSampleCustomAudienceSignals(AdTechIdentifier buyer, + String name) { + String owner = "www.example-dsp.com"; + AdSelectionSignals userBiddingSignals = AdSelectionSignals.fromString("{\"signals\":[]}"); + return new CustomAudienceSignals.Builder() + .setOwner(owner) + .setBuyer(buyer) + .setActivationTime(ACTIVATION_TIME) + .setExpirationTime(EXPIRATION_TIME) + .setUserBiddingSignals(userBiddingSignals) + .setName(name) + .build(); + } + + private AdSelectionConfig getSampleAdSelectionConfig(AdTechIdentifier seller, + AdSelectionSignals sellerSignals, + Map perBuyerSignals) { + Uri decisionLogicUri = Uri.parse("https://www.example-ssp.com/decide.js"); + Uri trustedScoringSignalsUri = Uri.parse("https://www.example-ssp.com/signals"); + List buyers = ImmutableList.copyOf( + new ArrayList<>(perBuyerSignals.keySet())); + return new AdSelectionConfig.Builder() + .setSeller(seller) + .setDecisionLogicUri(decisionLogicUri) + .setCustomAudienceBuyers(buyers) + .setAdSelectionSignals(AdSelectionSignals.EMPTY) + .setSellerSignals(sellerSignals) + .setPerBuyerSignals(perBuyerSignals) + .setTrustedScoringSignalsUri(trustedScoringSignalsUri) + .build(); + } + + private AdSelectionSignals generatePerBuyerSignals(int size) { + String signalArrayFormat = "[\"%d\",\"123\",%d]"; + String signalArray = IntStream.rangeClosed(1, size) + .mapToObj(i -> String.format(Locale.ENGLISH, signalArrayFormat, i, i)) + .collect(Collectors.joining(", ", "[", "]")); + return AdSelectionSignals.fromString( + String.format(Locale.ENGLISH, "{\"signals\":[null,%s,[null]]}", + signalArray)); + } }