На iPad, использующем Safari, перейдите на эту страницу: http://ifelse.org/projects/errors/viewport/test.html
Это Источник:
Viewport Test
This is 1024 with a 3px border, so device width is 1030.
Works when viewing in Mobile Safari.
Does not work if you Bookmark it to the Home Screen and open from there.
Compare MobileSafari view to Webapp view.
Он должен выглядеть так, как это изображение, где область просмотра
размером 1030 пикселей полностью виден в портретном режиме:
Тег viewport
по существу игнорируется. Я пробовал несколько вариантов предъявления иска к устройству со смешанными значениями пикселей. Ничего.
Так ... это ошибка или особенность?
Если это сделано намеренно со стороны Apple, по сути, это означает, что нужно правильно разрабатывать красивые веб-приложения, которые вам нужны с реальной шириной 768 пикселей ... интерпретатор тратит много времени перед вызовом следующей функции. И я наблюдаю ту же проблему в конце приложения, когда программа должна завершиться: много времени (~ часов!) Проходит между последней меткой времени на экране и появлением нового приглашения.
Использование памяти работает стабильно, поэтому у меня действительно нет утечек памяти.
Есть предложения?
Может ли сборка мусора тысяч больших объектов C ++ работать так медленно?
Есть ли способ ускорить это?
] ОБНОВЛЕНИЕ:
Большое спасибо за все ваши ответы, вы дали мне много советов по отладке моего кода: -)
Я использую Python 2.6.5 в Scientific Linux 5, настраиваемый дистрибутив на основе Red Hat Enterprise 5. И на самом деле я использую не SWIG для получения привязок Python для нашего кода C ++, а фреймворк Reflex / PyROOT. Я знаю, что он не очень известен за пределами физики элементарных частиц (но все еще с открытым исходным кодом и находится в свободном доступе), и я должен использовать его, потому что он используется по умолчанию для нашей основной структуры.
И в этом контексте команда DEL со стороны Python не работает. работа, я уже пробовал. DEL удаляет только переменную python, связанную с объектом C ++, но не сам объект в памяти, который все еще принадлежит стороне C ++ ...
... Я знаю, это нестандартно, я думаю, и немного сложнее , извините :-P
Но, следуя вашим подсказкам, я профилирую свой код и вернусь к вам с более подробной информацией, как вы предлагали.
ДОПОЛНИТЕЛЬНОЕ ОБНОВЛЕНИЕ:
Хорошо, следуя вашим предложениям, Я инструментировал свой код с помощью cProfile
, и я обнаружил, что на самом деле функция gc.collect ()
- это функция, занимающая большую часть времени работы !!
Здесь вывод из cProfile
+ pstats
print_stats ():
>>> p.sort_stats("time").print_stats(20) Wed Oct 20 17:46:02 2010 mainProgram.profile 547303 function calls (542629 primitive calls) in 548.060 CPU seconds Ordered by: internal time List reduced from 727 to 20 due to restriction ncalls tottime percall cumtime percall filename:lineno(function) 4 345.701 86.425 345.704 86.426 {gc.collect} 1 167.115 167.115 200.946 200.946 PlotD3PD_v3.2.py:2041(PlotSamplesBranches) 28 12.817 0.458 13.345 0.477 PlotROOTUtils.py:205(SaveItems) 9900 10.425 0.001 10.426 0.001 PlotD3PD_v3.2.py:1973(HistoStyle) 6622 5.188 0.001 5.278 0.001 PlotROOTUtils.py:403(__init__) 57 0.625 0.011 0.625 0.011 {built-in method load} 103 0.625 0.006 0.792 0.008 dbutils.py:41(DeadlockWrap) 14 0.475 0.034 0.475 0.034 {method 'dump' of 'cPickle.Pickler' objects} 6622 0.453 0.000 5.908 0.001 PlotROOTUtils.py:421(CreateCanvas) 26455 0.434 0.000 0.508 0.000 /opt/root/lib/ROOT.py:215(__getattr__) [...] >>> p.sort_stats("cumulative").print_stats(20) Wed Oct 20 17:46:02 2010 mainProgram.profile 547303 function calls (542629 primitive calls) in 548.060 CPU seconds Ordered by: cumulative time List reduced from 727 to 20 due to restriction ncalls tottime percall cumtime percall filename:lineno(function) 1 0.001 0.001 548.068 548.068 PlotD3PD_v3.2.py:2492(main) 4 0.000 0.000 346.756 86.689 /usr/lib//lib/python2.5/site-packages/guppy/heapy/Use.py:171(heap) 4 0.005 0.001 346.752 86.688 /usr/lib//lib/python2.5/site-packages/guppy/heapy/View.py:344(heap) 1 0.002 0.002 346.147 346.147 PlotD3PD_v3.2.py:2537(LogAndFinalize) 4 345.701 86.425 345.704 86.426 {gc.collect} 1 167.115 167.115 200.946 200.946 PlotD3PD_v3.2.py:2041(PlotBranches) 28 12.817 0.458 13.345 0.477 PlotROOTUtils.py:205(SaveItems) 9900 10.425 0.001 10.426 0.001 PlotD3PD_v3.2.py:1973(HistoStyle) 13202 0.336 0.000 6.818 0.001 PlotROOTUtils.py:431(PlottingCanvases) 6622 0.453 0.000 5.908 0.001 /root/svn_co/rbianchi/SoftwareDevelopment [...] >>>
Итак, в обоих выходных данных, отсортированных по «времени» и «кумулятивному» времени соответственно, gc.collect ()
является функцией, занимающей большую часть времени работы моя программа! :-P
И это результат профилировщика памяти Heapy
, непосредственно перед возвратом программы main ()
.
memory usage before return: Partition of a set of 65901 objects. Total size = 4765572 bytes. Index Count % Size % Cumulative % Kind (class / dict of class) 0 25437 39 1452444 30 1452444 30 str 1 6622 10 900592 19 2353036 49 dict of PlotROOTUtils.Canvas 2 109 0 567016 12 2920052 61 dict of module 3 7312 11 280644 6 3200696 67 tuple 4 6622 10 238392 5 3439088 72 0xa4ab74c 5 6622 10 185416 4 3624504 76 PlotROOTUtils.Canvas 6 2024 3 137632 3 3762136 79 types.CodeType 7 263 0 129080 3 3891216 82 dict (no owner) 8 254 0 119024 2 4010240 84 dict of type 9 254 0 109728 2 4119968 86 type Index Count % Size % Cumulative % Kind (class / dict of class) 10 1917 3 107352 2 4264012 88 function 11 3647 5 102116 2 4366128 90 ROOT.MethodProxy 12 148 0 80800 2 4446928 92 dict of class 13 1109 2 39924 1 4486852 93 __builtin__.wrapper_descriptor 14 239 0 23136 0 4509988 93 list 15 87 0 22968 0 4532956 94 dict of guppy.etc.Glue.Interface 16 644 1 20608 0 4553564 94 types.BuiltinFunctionType 17 495 1 19800 0 4573364 94 __builtin__.weakref 18 23 0 11960 0 4585324 95 dict of guppy.etc.Glue.Share 19 367 1 11744 0 4597068 95 __builtin__.method_descriptor
Есть идеи, почему или как оптимизировать сборка мусора?
Могу ли я выполнить более подробную проверку?