Журнал LinuxFormat - перейти на главную

LXF135:OOo

Материал из Linuxformat
Перейти к: навигация, поиск
Поль­зо­ва­тель­ские функ­ции До­бавь­те элек­трон­ным таб­ли­цам не­дос­таю­щий функ­цио­нал

Содержание

OOo Calc: На кон­вей­е­ре

На­после­док Алек­сандр Мад­жу­гин рас­смот­рит слож­ные функ­ции, ко­то­рые используют в сво­ей ра­бо­те дан­ные из мно­же­ства яче­ек, в том чис­ле – ре­кур­сив­но.


OOo Calc

В пре­ды­ду­щих стать­ях это­го (к со­жа­лению, под­хо­дя­ще­го к сво­ему ло­ги­че­ско­му фи­на­лу) цик­ла мы рас­смот­ре­ли во­про­сы соз­дания, ис­поль­зо­вания и оп­ти­ми­за­ции поль­зо­ва­тель­ских функ­ций в OpenOffice.org Calc. Дан­ный же урок бу­дет по­свя­щен оп­ти­ми­за­ции кон­вей­е­ров вы­чис­лений непо­сред­ствен­но в са­мой элек­трон­ной таб­ли­це, а так­же об­щей оп­ти­ми­за­ции элек­трон­ной таб­ли­цы, спо­соб­ной зна­чи­тель­но улуч­шить ра­бо­ту с ней.

Что я на­зы­ваю здесь кон­вей­е­ром вы­чис­лений? Кон­вей­ер вы­чис­лений – это по­сле­до­ва­тель­ность фор­мул, ка­ж­дая по­сле­дую­щая из ко­то­рых ис­поль­зу­ет как свой ар­гу­мент ре­зуль­тат пре­ды­ду­щей. Есте­ствен­но, что для дости­жения необ­хо­ди­мо­го ре­зуль­та­та мо­гут быть ис­поль­зо­ва­ны кон­ст­рук­тив­но раз­лич­ные кон­вей­е­ры. И столь же есте­ствен­но, что ско­рость вы­чис­ления в них так­же бу­дет раз­лич­на, при­чём, как мы уви­дим да­лее, от­ли­чать­ся она мо­жет доста­точ­но силь­но.

Рис.1

Рис. 1. Кон­вей­ер вы­чис­ле­ния ADX на­счи­ты­ва­ет 33 «эта­па» (си­ние стрел­ки), и это еще да­ле­ко не пре­дел.

На рис. 1 по­ка­зан кон­вей­ер вы­чис­ления третье­го в ря­де зна­чений техниче­ско­го ин­ди­ка­то­ра ADX. Вид­но, что для получения результата по­тре­бо­ва­лось пред­ва­ри­тель­но вы­чис­лить 33 зна­че­ния в дру­гих ячей­ках, а ведь это ещё не са­мый слож­ный расчёт.

Из­ме­ря­ем ско­рость

Как и при оп­ти­ми­за­ции поль­зо­ва­тель­ских функ­ций, напи­сан­ных на Basic, здесь нам по­тре­бу­ет­ся ин­ст­ру­мен­та­рий, как минимум для за­ме­ра ско­ро­сти вы­чис­лений в кон­вей­е­ре. Од­на­ко та­ким же про­стым ре­шением, ка­кое мы ис­поль­зо­ва­ли для за­ме­ра вре­мени ра­бо­ты ко­да в LXF134, нам уже не обой­тись.

Фор­ма­ли­зу­ем за­да­чу. Итак, нам необ­хо­ди­мо за­ме­рить вре­мя рас­чё­та неко­то­рой связ­ной по­сле­до­ва­тель­но­сти фор­мул, для че­го по­тре­бу­ет­ся за­сечь вре­мя инициа­ции рас­чё­та и вре­мя из­менения ячей­ки, воз­вра­щаю­щей ре­зуль­тат вы­чис­ления. Это зна­чит, что по­на­до­бят­ся две про­це­ду­ры – для за­пуска рас­чё­та и для ре­ги­ст­ра­ции его за­вер­шения со­от­вет­ствен­но. OpenOffice.org – не Perl, но и в нем для ре­шения за­да­чи есть бо­лее од­но­го пу­ти; мой пред­став­лен на Листин­ге 1 на диске. Для боль­ше­го удоб­ства я напи­сал для се­бя про­стень­кий шаб­лон, ко­то­рый так­же мож­но най­ти на DVD в фай­ле CalcSpeedTester.ods.

Смысл ра­бо­ты ко­да в сле­дую­щем: стар­то­вая про­це­ду­ра из­ме­ня­ет со­дер­жи­мое ячей­ки, ко­то­рая иниции­ру­ет вы­чис­ление в кон­вей­е­ре, и со­хра­ня­ет вре­мя это­го со­бы­тия в гло­баль­ной пе­ре­мен­ной starttimepoint. Когда из­ме­ня­ет­ся со­дер­жи­мое по­следней ячей­ки кон­вей­е­ра, вы­пол­ня­ет­ся функ­ция CalcTimerStop, вы­чис­ляю­щая вре­мя, про­шед­шее с по­следнего из­менения гло­баль­ной пе­ре­мен­ной starttimepoint.

Для ис­поль­зо­вания шаб­ло­на сле­ду­ет вве­сти два раз­лич­ных зна­чения из об­ласти оп­ре­де­ления кон­вей­е­ра в ячей­ки A1 и A2 листа «Тести­руе­мая по­сле­до­ва­тель­ность». Это необ­хо­ди­мо для то­го, что­бы зна­чение ячей­ки, на ко­то­рую ссыла­ет­ся кон­вей­ер, из­ме­ня­лось при ка­ж­дом на­жа­тии кноп­ки Старт, на­хо­дя­щей­ся на листе «Тест». Зна­чения из яче­ек A1 и A2 бу­дут че­ре­до­вать­ся.

Сам кон­вей­ер дол­жен ссылать­ся на ячей­ку A3 (start), а в ячей­ке A4 (finish) долж­на быть ссыл­ка на по­след­нюю из­ме­няю­щую­ся ячей­ку по­сле­до­ва­тель­но­сти. Кон­вей­ер мож­но раз­местить тут же – на листе «Тести­руе­мая по­сле­до­ва­тель­ность».

Рас­смот­рим про­стой при­мер – тест функ­ции SUM в сравнении с про­стым сум­ми­ро­ванием зна­чения ка­ж­дой ячей­ки. Для уве­ли­чения вре­мени рас­чё­та дан­ных долж­но быть мно­го, а сам кон­вей­ер луч­ше по­вто­рить несколь­ко раз с по­сле­до­ва­тель­ны­ми ссыл­ка­ми сле­дую­ще­го кон­вей­е­ра на пре­ды­ду­щий.

Рис.2

Рис. 2. По­сле­до­ва­тель­ность кон­вей­е­ров SUM.

На рис. 2 по­ка­за­на схе­ма свя­зей тести­руе­мой по­сле­до­ва­тель­но­сти. Столб­цы с G по AY и стро­ки с 6‑й по 98‑ю скры­ты для эко­но­мии места. Ячей­ки в стро­ках со 2‑й по 100‑ю со­дер­жат про­сто чи­сло­вые зна­чения от 2 до 100 со­от­вет­ствен­но. Ячей­ка в стро­ке 1 ка­ж­до­го кон­вей­е­ра со­дер­жит ссыл­ку на ре­зуль­тат пре­ды­ду­ще­го, чем дости­га­ет­ся по­сле­до­ва­тель­ное вы­чис­ление функ­ции SUM. Фор­му­лы в стро­ке 101 име­ют вид =SUM(#1:#100), где # – имя со­от­вет­ствую­ще­го столб­ца.

Вре­мя вы­полнения этой схе­мы на мо­ём но­ут­бу­ке со­ста­ви­ло око­ло 7 мил­ли­се­кунд – это­го, как пра­ви­ло, недоста­точ­но для на­дёж­но­го теста, и по­сле­до­ва­тель­ность стои­ло бы уве­ли­чить, но в дан­ном слу­чае нас это уст­раи­ва­ет, так как для фор­мул ви­да =#1+#2+...+#99+#100 вре­мя рас­чё­та со­став­ля­ет око­ло 170 мил­ли­се­кунд, что поч­ти в 25 раз доль­ше.

Та­ким об­ра­зом мы при­хо­дим к пер­во­му пра­ви­лу оп­ти­ми­за­ции вы­чис­лений в Calc – вез­де, где это воз­мож­но, сто­ит ис­поль­зо­вать встро­ен­ные функ­ции па­ке­та, а не их реа­ли­за­цию в ви­де фор­мул, с по­мо­щью бо­лее про­стых функ­ций и опе­ра­то­ров.

Впро­чем, дан­ный при­ём эле­мен­та­рен и оче­ви­ден, а по­то­му ма­ло­по­ле­зен, но за­то он хо­ро­шо по­ка­зы­ва­ет, ка­ки­ми мо­гут быть по­те­ри вре­мени при непра­виль­ном про­ек­ти­ро­вании кон­вей­е­ров вы­чис­лений.

Дру­гим ин­туи­тив­ным спо­со­бом уско­рения рас­чё­тов в Calc, по-ви­ди­мо­му, яв­ля­ет­ся сво­ра­чи­вание кон­вей­е­ра в минимум фор­мул. Под эти­ми сло­ва­ми понима­ет­ся та­кое пре­об­ра­зо­вание фор­мул в по­сле­до­ва­тель­но ссылаю­щих­ся друг на дру­га ячей­ках, при ко­то­ром часть из них встраи­ва­ет­ся в за­ви­си­мые фор­му­лы для со­кра­щения ко­ли­че­ства ссылок в кон­вей­е­ре. На­при­мер по­сле­до­ва­тель­ность фор­мул ви­да C1=A1+B1, D1=C1*32, E1=If(D1>100;1;0), оче­вид­но, при­во­дит­ся к ви­ду E1=If((A1+B1)*32>100;1;0), то есть сво­ра­чи­ва­ет­ся в од­ну-един­ствен­ную фор­му­лу. На­сколь­ко это эф­фек­тив­но?

Для про­вер­ки это­го приё­ма в ба­зо­вом, неоп­ти­ми­зи­ро­ван­ном пред­став­лении, я ис­поль­зо­вал по­сле­до­ва­тель­ность из 14 по­сле­до­ва­тель­но свя­зан­ных фор­мул, сре­ди ко­то­рых бы­ли вы­ра­жения, со­дер­жа­щие са­мые обыч­ные ариф­ме­ти­че­ские дей­ствия, функ­ции усло­вий IF и CHOOSE, а так­же функ­ции для ра­бо­ты с тек­стом и функ­ции пре­об­ра­зо­вания ти­пов. В ви­де, свёр­ну­том в минимум по­сле­до­ва­тель­ных фор­мул, они пред­став­ля­ли со­бой лишь три по­сле­до­ва­тель­но свя­зан­ных вы­ра­жения – D2=COUNTIF(F1;”<0”)+1 (F1 – ре­зуль­тат вы­чис­ления в пре­ды­ду­щей по­сле­до­ва­тель­но­сти), E2=IF((D2*3+2)/4=2;56;2) и F2 =VALUE(RIGHT(“00”& TEXT(SQRT(E2*E2);”000000”);2))-14.

В ре­зуль­та­те вы­иг­рыш по вре­мени рас­чё­та со­ста­вил чуть бо­лее 6 %; от­кро­вен­но го­во­ря – не так уж и мно­го. Од­на­ко ес­ли взять ту же по­сле­до­ва­тель­ность и опустить тра­ди­ци­он­но дол­гие опе­ра­ции по пре­об­ра­зо­ванию ти­пов и, со­от­вет­ствен­но, тек­сто­вые опе­ра­ции, то это при­во­дит не толь­ко к трое­крат­но­му росту ско­ро­сти вы­чис­ления дан­ной по­сле­до­ва­тель­но­сти, но и при­мер­но к та­ко­му же росту вы­иг­ры­ша от оп­ти­ми­за­ции – до 15 %.

Из дан­но­го опы­та мож­но сде­лать вы­вод, что та­кой тип по­вы­шения про­из­во­ди­тель­но­сти ес­ли и сто­ит ис­поль­зо­вать, то толь­ко для ма­те­ма­ти­че­ских рас­чё­тов и умень­шения раз­ме­ра ито­го­во­го фай­ла, так как мень­ шее ко­ли­че­ство за­дей­ство­ван­ных в рас­чё­те яче­ек часто ве­дёт к со­кра­щению его раз­ме­ров. В дан­ном слу­чае оп­ти­ми­зи­ро­ван­ный файл стал (по сравнению с ис­ход­ным) мень­ше в два с лишним раза (27 КБ про­тив 65 КБ). А умень­шение раз­ме­ров фай­ла ведёт к зна­чи­тель­ному со­кра­щению вре­мени его от­кры­тия в OpenOffice.org Calc.

Ещё одним, пусть и менее из­вест­ным, ме­то­дом оп­ти­ми­за­ции как ско­ро­сти рас­чё­та, так и раз­ме­ра фай­лов счи­та­ют­ся фор­му­лы мас­си­ва. За под­роб­но­стя­ми о том, что это та­кое, вы мо­же­те об­ра­тит­ься к встро­ен­ной справ­ке па­ке­та OpenOffice.org – здесь я не ста­ну опи­сы­вать их, так как они то­го не очень-то и за­слу­жи­ва­ют. По­че­му я так счи­таю? Вот об этом-то мы и по­го­во­рим под­робнее, а за­од­но по­ста­ра­ем­ся пре­досте­речь вас от из­лишних труд­но­стей с по­строением вы­чис­лений в на­де­ж­де на их оп­ти­маль­ность.

Счи­та­ет­ся, что фор­му­лы мас­си­ва да­ют при рас­чё­тах зна­чи­тель­ную эко­но­мию вре­мени в си­лу двух при­чин: во-пер­вых, они по­треб­ля­ют су­ще­ствен­но мень­ше опе­ра­тив­ной па­мя­ти, во-вто­рых, при по­лу­чении дан­ных из влияю­щих диа­па­зо­нов из­вле­ка­ют их не по од­ной ячей­ке, а сра­зу це­лы­ми диа­па­зо­на­ми, на ко­то­рые ссыла­ют­ся.

Од­на­ко пер­вое кри­тич­но исклю­чи­тель­но для систем с неболь­шим объ­ё­мом ОЗУ (конеч­но, всё за­ви­сит от слож­но­сти рас­чё­тов, но я бы ска­зал, что да­же при очень боль­ших объ­ё­мах дан­ных это не станет кри­тич­ным фак­то­ром, ес­ли у вас боль­ше 512 МБ), а вто­рое ха­рак­тер­но толь­ко для ста­рых вер­сий па­ке­та – в OpenOffice.org от 3.0 и вы­ше из­вле­чение дан­ных из влияю­щих яче­ек зна­чи­тель­но оп­ти­ми­зи­ро­ва­но, и фор­му­лы мас­си­вов уже не да­ют то­го при­роста про­из­во­ди­тель­но­сти, ка­кой был рань­ше.

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

Так что же, един­ствен­ным ме­то­дом оп­ти­ми­за­ции, даю­щим ощу­ти­мый при­рост в ско­ро­сти вы­чис­лений, яв­ля­ет­ся из­бе­гание воссоз­дания функ­ций, встро­ен­ных в OpenOffice.org Calc? Нет, конеч­но – мож­но по­ре­ко­мен­до­вать ещё несколь­ко доста­точ­но стан­дарт­ных пра­вил:

  • Не де­лать лишних вы­чис­лений и сле­дить за тем, что­бы ал­го­ритм ре­шения был оп­ти­маль­ным.
  • Из­бе­гать по­втор­ных вы­чис­лений (на­при­мер, ес­ли у вас есть фор­му­ла ви­да E1=If(A1*B1+C1>0;A1*B1+C1;A1*B1+C1+D1), то её луч­ше раз­бить на две – E1=A1*B1+C1 и F1=If(E1>0;E1;E1+D1), что­бы не вы­чис­лять A1*B1+C1 два­ж­ды для ка­ж­дой стро­ки).
  • При пре­об­ра­зо­вании ти­пов из­бе­гай­те яв­но­го пре­об­ра­зо­вания, осо­бен­но когда это ка­са­ет­ся пре­об­ра­зо­вания тек­ста в чис­ло. Это мо­жет зву­чать несколь­ко стран­но и непри­выч­но для тех, кто зна­ком с про­грам­ми­ро­ванием, но это спра­вед­ли­во для Calc – ис­поль­зуя функ­цию VALUE (на­при­мер, =VALUE(A1)*5 вме­сто =A1*5), вы мо­же­те по­те­рять до 15 % про­из­во­ди­тель­но­сти.

Я не бу­ду при­во­дить здесь опи­сание под­роб­но­го тести­ро­вания ка­ж­до­го из приё­мов – раз­мер ста­тьи всё же ог­раничен, а ре­зуль­тат при­менения мо­жет очень силь­но за­ви­сеть от кон­крет­но­го ре­шения. При этом вы все­гда мо­же­те са­ми про­тести­ро­вать лю­бое ре­шение на пред­мет про­из­во­ди­тель­но­сти, ис­поль­зуя на­хо­дя­щий­ся на диске файл CalcSpeedTester.ods.

При­менение опи­сан­ных вы­ше пра­вил по­мо­жет вам сде­лать рас­чё­ты в Calc несколь­ко бо­лее бы­ст­ры­ми, а ра­бо­ту ком­фортнее, но это ещё да­ле­ко не пре­дел.

Ви­зуа­ли­за­ция и фор­ма­ти­ро­вание

Рас­чё­ты в элек­трон­ных таб­ли­цах обыч­но не ог­раничи­ва­ют­ся са­ми­ми вы­чис­ления­ми – им со­пут­ству­ет ещё и ви­зуа­ли­за­ция ре­зуль­та­та, от про­сто­го ото­бра­жения чи­сел до слож­но­го услов­но­го фор­ма­ти­ро­вания. И нет ниче­го неожидан­но­го в том, что спо­соб ото­бра­жения мо­жет вли­ять на ско­рость вы­чис­лений, при­чём иногда очень силь­но, а иногда и… стран­но.

Есте­ствен­но, что ра­зо­брать­ся в боль­шом объ­ё­ме дан­ных за­частую до­воль­но труд­но, и в гла­зах ря­бит от цифр – труд­но по­нять, где экстре­му­мы функ­ций, где по­ло­жи­тель­ные зна­чения сли­ва­ют­ся с от­ри­ца­тель­ны­ми и так да­лее. В таком слу­чае на по­мощь при­хо­дят воз­мож­но­сти услов­но­го фор­ма­ти­ро­вания. Од­на­ко это, ка­за­лось бы, никак не свя­зан­ное с вы­чис­лением ре­зуль­та­та воз­мож­ность мо­жет, в неко­то­рых слу­ча­ях, за­мед­лить его по­лу­чение, а иногда и... уско­рить его!

Рис.3

Рис. 3. Ус­лов­ное фор­ма­ти­ро­ва­ние ячей­ки воз­мож­но как на ос­но­ва­нии ее зна­че­ния, так и по фор­му­ле.

Как вы, на­вер­ное, знае­те, су­ще­ству­ют два спо­со­ба за­дания усло­вия фор­ма­ти­ро­вания ячей­ки с ре­зуль­та­том – пер­вый осно­ван на сравнении зна­чения ячей­ки с кон­стан­той или зна­чением дру­гой ячей­ки, а вто­рой осно­ван на вы­чис­лении истин­но­сти фор­му­лы; рис. 3. Так вот, в ис­поль­зо­вании этих ме­то­дов на­ли­че­ству­ет зна­чи­тель­ная разница. Пер­вый из них со­всем не стра­шен: он поч­ти не снижа­ет ско­рость рас­чё­тов, бо­лее то­го, при неко­то­рых усло­ви­ях спо­со­бен зна­чи­тель­но по­вы­шать её, иногда в ра­зы. При­чи­на та­ко­го по­ве­дения Calc оста­ёт­ся неяс­ной, но на­блю­дае­мый эф­фект доста­точ­но ста­би­лен – ниже я при­ве­ду неко­то­рые циф­ры. Вто­рой спо­соб (когда усло­ви­ем фор­ма­ти­ро­вания яв­ля­ет­ся истин­ность фор­му­лы), как и мож­но ожи­дать, да­ёт от­ри­ца­тель­ный эф­фект, осо­бен­но в том слу­чае, ес­ли в фор­му­ле уча­ству­ет ссыл­ка, за­ви­ся­щая от зна­чения фор­ма­ти­руе­мой ячей­ки.

Те­перь соб­ствен­но о циф­рах. Для теста я ис­поль­зо­вал вы­чис­ление стои­мо­сти тон­ны неф­ти в ун­ци­ях зо­ло­та, осно­вы­ва­ясь на цене ун­ции зо­ло­та и бар­ре­ля неф­ти в дол­ла­рах. Моя таб­ли­ца ис­ход­ных дан­ных со­дер­жа­ла по­ча­со­вые ко­ти­ров­ки при­бли­зи­тель­но за два го­да, а фак­ти­че­ски 11 229 зна­чений. Фи­на­лом вы­чис­ления при этом яв­лял­ся рас­чёт средней це­ны неф­ти, вы­ра­жен­ной в зо­ло­те, за ука­зан­ный пе­ри­од.

Вы­чис­ление без фор­ма­ти­ро­вания занима­ло у ме­ня в среднем око­ло 700 мил­ли­се­кунд. При услов­ном фор­ма­ти­ро­вании ячей­ки, осно­ван­ном на фор­му­ле ви­да $'Лист'.#X>$'Лист'.$J$2, где $'Лист'.#X – ссыл­ка на фор­ма­ти­руе­мую ячей­ку (на­при­мер, $'Лист'.I2 для ячей­ки I2), а $'Лист'.$I$2 – ссыл­ка на ре­зуль­тат, вре­мя рас­чё­та воз­росло до 770 мил­ли­се­кунд (на 10 %), ес­ли лист с вы­чис­ления­ми и фор­ма­ти­ро­ванием был неак­ти­вен, и до 880 мил­ли­се­кунд (на 25 %), ес­ли вы­чис­ления вы­пол­ня­лись на ак­тив­ном листе.

Од­на­ко ку­да ин­те­реснее ре­зуль­та­ты из­ме­рений для фор­ма­ти­ро­вания с усло­ви­ем, опи­раю­щим­ся непо­сред­ствен­но на зна­чение ячей­ки. Здесь, при вы­чис­лении на неак­тив­ном листе, ско­рость па­да­ла со­вер­шен­но незна­чи­тель­но – на 3 % (720 мил­ли­се­кунд). А вот на вы­чис­ление на ак­тив­ном листе Calc тра­тил все­го 230 мил­ли­се­кунд! То есть в дан­ном слу­чае при­рост ско­ро­сти был око­ло 67 % – бо­лее чем в 3 (!) раза.

Этот эф­фект про­па­да­ет, ес­ли стол­бец с услов­ным фор­ма­ти­ро­ванием скрыть. Эф­фект на­блю­да­ет­ся прак­ти­че­ски все­гда, ес­ли при вы­чис­лении на ак­тив­ном (ви­ди­мом) листе со­дер­жит­ся хо­тя бы од­на ячей­ка с услов­ным фор­ма­ти­ро­ванием, осно­ван­ном на сравнении зна­чения ячей­ки с дру­гой ячей­кой на этом же листе, да­же ес­ли стиль дан­ной ячей­ки при этом не из­ме­ня­ет­ся.

При все­сто­ронней про­вер­ке эф­фек­та, иногда уда­ва­лось до­бить­ся аж де­ся­ти­крат­но­го уско­рения. Это дей­стви­тель­но неожи­дан­ный ре­зуль­тат и од­но­вре­мен­но от­лич­ная воз­мож­ность понизить вре­мен­ные за­тра­ты прак­ти­че­ски да­ром.

Диа­грам­мы и гра­фи­че­ские объ­ек­ты

Фор­ма­ти­ро­вание, конеч­но же, не един­ствен­ный спо­соб сде­лать дан­ные бо­лее на­гляд­ны­ми – часто, при об­ра­бот­ке боль­ших мас­си­вов дан­ных, для гра­фи­че­ско­го пред­став­ления ре­зуль­та­тов ис­поль­зу­ют­ся диа­грам­мы. И неред­ко, осо­бен­но на не очень про­из­во­ди­тель­ных ком­пь­ю­те­рах, при ото­бра­жении диа­грамм возника­ют ощу­ти­мые и до­сад­ные за­держ­ки, пре­иму­ще­ствен­но во вре­мя их про­крут­ки. Ещё од­ной при­чи­ной раз­дра­жения поль­зо­ва­те­ля мо­гут стать гра­фи­че­ские объ­ек­ты, рас­по­ло­жен­ные на листах Calc. Кста­ти, об­ра­ти­те внимание, что при­ме­чания к ячей­кам листа так­же яв­ля­ют­ся век­тор­ны­ми изо­бра­жения­ми, и ес­ли до­ку­мент cодержит боль­шое ко­ли­че­ство при­ме­чаний с вклю­чен­ным непре­рыв­ным ото­бра­жением (оп­ция кон­тек­ст­но­го ме­ню По­ка­зать при­ме­чание), это то­же мо­жет вы­зы­вать серь­ёз­ные за­держ­ки.

Вна­ча­ле раз­бе­рём­ся с диа­грам­ма­ми и век­тор­ны­ми изо­бра­жения­ми, соз­дан­ны­ми здесь же – в са­мом Calc. Как пра­ви­ло, дли­тель­ные за­держ­ки при про­крут­ке этих объ­ек­тов вы­зва­ны вклю­чён­ным сгла­жи­ванием век­тор­ных объ­ек­тов. Сгла­жи­вание де­ла­ет линии бо­лее плав­ны­ми, уби­рая эф­фект «ле­сен­ки», но при этом оно доста­точ­но ре­сур­со­ём­ко.

Рис.4

Рис. 4. На­строй­ка ото­бра­же­ния гра­фи­че­ских объ­ек­тов.

От­клю­чить сгла­жи­вание мож­но в на­строй­ках па­ке­та: ме­ню Сер­вис > Па­ра­мет­ры..., за­тем в раз­де­ле OpenOffice.org от­крыв­ше­го­ся диа­ло­го­во­го ок­на необ­хо­ди­мо вы­брать пункт Вид и снять га­лоч­ку Ис­поль­зо­вать сгла­жи­вание, как по­ка­за­но на рис. 4.

Ес­ли ваш ком­пь­ю­тер осна­щён доста­точ­ным ко­ли­че­ством опе­ра­тив­ной па­мя­ти, вы так­же мо­же­те уве­ли­чить кэш гра­фи­че­ских объ­ек­тов. Для это­го необ­хо­ди­мо вы­брать пункт Па­мять в том же раз­де­ле то­го же диа­ло­го­во­го ок­на Па­ра­мет­ры.... Ес­ли не жал­ко, под эти ну­ж­ды па­ке­та мож­но от­вести до 256МБ. Кро­ме то­го, мож­но ука­зать пре­дел ис­поль­зуе­мой па­мя­ти для кэ­ши­ро­вания од­но­го изо­бра­жения и вре­мя, че­ рез ко­то­рое па­мять, за­ня­тая под кэш, бу­дет осво­бо­ж­де­на.

А как влия­ет на­ли­чие диа­грам­мы на вре­мя вы­чис­ления ре­зуль­та­та? На ско­рость са­мо­го вы­чис­ления диа­грам­ма не влия­ет прак­ти­че­ски никак, а вот на ско­рость от­ри­сов­ки ак­тив­но­го листа мо­жет по­вли­ять доста­точ­но ощу­ти­мо – при диа­грам­ме для трёх ря­дов дан­ных и 2000 зна­чений за­держ­ка от­ри­сов­ки листа у ме­ня до­хо­ди­ла до 3–4 се­кунд, и это при вы­клю­чен­ном сгла­жи­вании; а ес­ли оно бы­ло вклю­че­но, то за­держ­ка воз­раста­ла поч­ти вдвое.

При­чи­ной за­держ­ки при ото­бра­жении встав­лен­ных гра­фи­че­ских объ­ек­тов – как пра­ви­ло, растро­вых – мо­жет стать встав­ка объ­ек­тов по ссыл­ке, когда гра­фи­че­ский объ­ект не ин­тег­ри­ру­ет­ся в файл до­ку­мен­та, а про­дол­жа­ет оста­вать­ся на за­по­ми­наю­щем уст­рой­стве уда­лен­но­го источника. Здесь за­держ­ки возника­ют при об­нов­лении объ­ек­тов, при от­кры­тии и со­хранении фай­ла. Они мо­гут стать осо­бен­но дли­тель­ны­ми, ес­ли гра­фи­че­ские объ­ек­ты рас­по­ло­же­ны в се­ти Ин­тернет.

Рис.5

Рис. 5. Интеграция гра­фи­че­ского объ­ек­та в документ.

Что­бы ре­шить эту про­бле­му, необ­хо­ди­мо ин­тег­ри­ро­вать ри­сун­ки непо­сред­ствен­но в файл до­ку­мен­та. Для это­го в ме­ню Прав­ка вы­бе­ри­те пункт Свя­зи.... От­кро­ет­ся диа­ло­го­вое ок­но Ре­дак­ти­ро­вание свя­зей, со­дер­жа­щие спи­сок изо­бра­жений, встав­лен­ных с со­хранением свя­зи с источником. Вы­бе­ри­те все пунк­ты спи­ска и на­жми­те кноп­ку Ра­зо­рвать связь – рис. 5. Все изо­бра­жения бу­дут по­лу­че­ны из источников и со­хранены в до­ку­мен­те. Об­ра­ти­те внимание, что это мо­жет за­нять неко­то­рое вре­мя.

Персональные инструменты
купить
подписаться
Яндекс.Метрика