Jump to content
  • 0

Сжатие подобного кода


IceBars
 Share

Question

Есть, например строки типа kor0=... и kor1=...

Таких строк набирается до 80кб, поэтому нужна оптимизация.

Будет ли код заметно сжиматься с eval, если например eval("kor"+i+"=...;") в цикле, где i -- счетчик?

П.С: можно ли включать тэгом <script type='text/javascript' src='url'> незаконченный код который вместе работает а по отдельности нет чтобы работал?Н-р, в 1 скрипте x=5 в другом alert(x) то при включении их в третий будут они выполняться?

Link to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 0

Сделал небльшой тестик для eval. Сразу извиняюсь за кривость вывода результатов, но разобараться можно.

<html>
<head>
<script type='text/javascript'>
function test1() {
var r = 999;
r += 1; r += 2; r += 3; r += 4; r += 5; r += 6; r += 7; r += 8; r += 9; r += 10;
r += 11; r += 12; r += 13; r += 14; r += 15; r += 16; r += 17; r += 18; r += 19; r += 20;
r += 21; r += 22; r += 23; r += 24; r += 25; r += 26; r += 27; r += 28; r += 29; r += 30;
r += 31; r += 32; r += 33; r += 34; r += 35; r += 36; r += 37; r += 38; r += 39; r += 40;
r += 41; r += 42; r += 43; r += 44; r += 45; r += 46; r += 47; r += 48; r += 49; r += 50;
r += 51; r += 52; r += 53; r += 54; r += 55; r += 56; r += 57; r += 58; r += 59; r += 60;
r += 61; r += 62; r += 63; r += 64; r += 65; r += 66; r += 67; r += 68; r += 69; r += 70;
r += 71; r += 72; r += 73; r += 74; r += 75; r += 76; r += 77; r += 78; r += 79; r += 80;
r += 81; r += 82; r += 83; r += 84; r += 85; r += 86; r += 87; r += 88; r += 89; r += 90;
r += 91; r += 92; r += 93; r += 94; r += 95; r += 96; r += 97; r += 98; r += 99; r += 100;

r += 101; r += 102; r += 103; r += 104; r += 105; r += 106; r += 107; r += 108; r += 109; r += 110;
r += 111; r += 112; r += 113; r += 114; r += 115; r += 116; r += 117; r += 118; r += 119; r += 120;
r += 121; r += 122; r += 123; r += 124; r += 125; r += 126; r += 127; r += 128; r += 129; r += 130;
r += 131; r += 132; r += 133; r += 134; r += 135; r += 136; r += 137; r += 138; r += 139; r += 140;
r += 141; r += 142; r += 143; r += 144; r += 145; r += 146; r += 147; r += 148; r += 149; r += 150;
r += 151; r += 152; r += 153; r += 154; r += 155; r += 156; r += 157; r += 158; r += 159; r += 160;
r += 161; r += 162; r += 163; r += 164; r += 165; r += 166; r += 167; r += 168; r += 169; r += 170;
r += 171; r += 172; r += 173; r += 174; r += 175; r += 176; r += 177; r += 178; r += 179; r += 180;
r += 181; r += 182; r += 183; r += 184; r += 185; r += 186; r += 187; r += 188; r += 189; r += 190;
r += 191; r += 192; r += 193; r += 194; r += 195; r += 196; r += 197; r += 198; r += 199; r += 200;

r += 201; r += 202; r += 203; r += 204; r += 205; r += 206; r += 207; r += 208; r += 209; r += 210;
r += 211; r += 212; r += 213; r += 214; r += 215; r += 216; r += 217; r += 218; r += 219; r += 220;
r += 221; r += 222; r += 223; r += 224; r += 225; r += 226; r += 227; r += 228; r += 229; r += 230;
r += 231; r += 232; r += 233; r += 234; r += 235; r += 236; r += 237; r += 238; r += 239; r += 240;
r += 241; r += 242; r += 243; r += 244; r += 245; r += 246; r += 247; r += 248; r += 249; r += 250;
r += 251; r += 252; r += 253; r += 254; r += 255; r += 256; r += 257; r += 258; r += 259; r += 260;
r += 261; r += 262; r += 263; r += 264; r += 265; r += 266; r += 267; r += 268; r += 269; r += 270;
r += 271; r += 272; r += 273; r += 274; r += 275; r += 276; r += 277; r += 278; r += 279; r += 280;
r += 281; r += 282; r += 283; r += 284; r += 285; r += 286; r += 287; r += 288; r += 289; r += 290;
r += 291; r += 292; r += 293; r += 294; r += 295; r += 296; r += 297; r += 298; r += 299; r += 300;

r += 301; r += 302; r += 303; r += 304; r += 305; r += 306; r += 307; r += 308; r += 309; r += 310;
r += 311; r += 312; r += 313; r += 314; r += 315; r += 316; r += 317; r += 318; r += 319; r += 320;
r += 321; r += 322; r += 323; r += 324; r += 325; r += 326; r += 327; r += 328; r += 329; r += 330;
r += 331; r += 332; r += 333; r += 334; r += 335; r += 336; r += 337; r += 338; r += 339; r += 340;
r += 341; r += 342; r += 343; r += 344; r += 345; r += 346; r += 347; r += 348; r += 349; r += 350;
r += 351; r += 352; r += 353; r += 354; r += 355; r += 356; r += 357; r += 358; r += 359; r += 360;
r += 361; r += 362; r += 363; r += 364; r += 365; r += 366; r += 367; r += 368; r += 369; r += 370;
r += 371; r += 372; r += 373; r += 374; r += 375; r += 376; r += 377; r += 378; r += 379; r += 380;
r += 381; r += 382; r += 383; r += 384; r += 385; r += 386; r += 387; r += 388; r += 389; r += 390;
r += 391; r += 392; r += 393; r += 394; r += 395; r += 396; r += 397; r += 398; r += 399; r += 400;

r += 401; r += 402; r += 403; r += 404; r += 405; r += 406; r += 407; r += 408; r += 409; r += 410;
r += 411; r += 412; r += 413; r += 414; r += 415; r += 416; r += 417; r += 418; r += 419; r += 420;
r += 421; r += 422; r += 423; r += 424; r += 425; r += 426; r += 427; r += 428; r += 429; r += 430;
r += 431; r += 432; r += 433; r += 434; r += 435; r += 436; r += 437; r += 438; r += 439; r += 440;
r += 441; r += 442; r += 443; r += 444; r += 445; r += 446; r += 447; r += 448; r += 449; r += 450;
r += 451; r += 452; r += 453; r += 454; r += 455; r += 456; r += 457; r += 458; r += 459; r += 460;
r += 461; r += 462; r += 463; r += 464; r += 465; r += 466; r += 467; r += 468; r += 469; r += 470;
r += 471; r += 472; r += 473; r += 474; r += 475; r += 476; r += 477; r += 478; r += 479; r += 480;
r += 481; r += 482; r += 483; r += 484; r += 485; r += 486; r += 487; r += 488; r += 489; r += 490;
r += 491; r += 492; r += 493; r += 494; r += 495; r += 496; r += 497; r += 498; r += 499; r += 500;

return r;
}

function test2() {
var r = 999;
for (var i=1; i<=500; i++)
eval("r += "+i.toString());
return r;
}

function test3() {
var r = 999;
var s = '';
for (var i=1; i<=500; i++)
s += "r += "+i.toString()+";";
eval(s);
return r;
}

function test4() {
var r = 999;
var s = '';
for (var i=1; i<=500; i++)
s += "r += "+i.toString()+";";
return r;
}

function doTest() {
var now = new Date();
var time = now.getTime();
for (var i=0; i<5000; i++)
test1();
now = new Date();
time = now.getTime() - time;
document.getElementById('time1').innerHTML = time.toString();
document.getElementById('res1').innerHTML = test1().toString();

var now = new Date();
var time = now.getTime();
for (var i=0; i<50; i++)
test2();
now = new Date();
time = now.getTime() - time;
document.getElementById('time2').innerHTML = (time*100).toString();
document.getElementById('res2').innerHTML = test2().toString();

var now = new Date();
var time = now.getTime();
for (var i=0; i<100; i++)
test3();
now = new Date();
time = now.getTime() - time;
document.getElementById('time3').innerHTML = (time*50).toString();
document.getElementById('res3').innerHTML = test3().toString();

var now = new Date();
var time = now.getTime();
for (var i=0; i<100; i++)
test4();
now = new Date();
time = now.getTime() - time;
document.getElementById('time4').innerHTML = (time*50).toString();
document.getElementById('res4').innerHTML = test4().toString();
}
</script>
</head>
<body>
5000 iterations:

time result

inline: <span id='time1'></span>  <span id='res1'></span>

eval's: <span id='time2'></span>  <span id='res2'></span>

one eval: <span id='time3'></span>  <span id='res3'></span>

one eval prepare: <span id='time4'></span>  <span id='res4'></span>

<button onclick="doTest();">test</button>
</body>
</html>

Смысл теста такой:

1) заранее приготовленная функция;

2) перебор с eval на каждом шаге

3) перебор с формированием строки и одним общим eval для этой строки

4) перебор с формированием строки без eval

Результат не утешителен. Конкретные цифры зависят от браузеров но имеют один порядок. Код с eval на каждом шаге работает в среднем 100 раз медленее (в опере почти в 200 раз, но это не только за счет медлительности eval но и за счет лучшего результата нативного кода). Формирование строки и одним общим eval для этой строки дает выигрыш почти в 2 раза. Последний тест призван показать, сколько реально времени тратится на конкатерацию строки, а не на финальный eval. Следовательно реальное время работы одного eval с функцией эквивалентной нативной, есть разница времени между третим и четвертым тестом.

Итак резальтаты замедления eval по сравнению с нативным кодом и собственно результат нативного кода:

Опера 9.5: 36 раз, 172 мс

ФФ 2.0.0.11: 30 раз, 375 мс

ФФ 3 бета 3: 30 раз, 340 мс

ИЕ 6: 14 раз, 297 мс

Сафари 3.0.5: 39,5 раз, 235 мс

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy