private static void Wrong()
Stopwatch watch = new Stopwatch();
watch.Start();
Parallel.For(0, 500000, p =>
{
int c = p;
});
watch.Stop();
long tempParalleTime = watch.ElapsedMilliseconds;
watch.Restart();
for (int i = 0; i < 500000; i++)
{
int c = i;
}
watch.Stop();
Console.WriteLine("顺序执行用时:" + watch.ElapsedMilliseconds);
Console.WriteLine("并行库用时:" + tempParalleTime);
}
这段并行代码看似没问题,可是执行出来的结果如下
明明并行了,为什么还是慢呢,简直有些不可思议,其实MSDN上有完整的解释:
System.Threading.Tasks.Parallel.For loop has a small body, it might perform more slowly than the equivalent sequential loop.’ data-guid=”a5a0118a06f0a1b142f8185f50ced09e”>当 System.Threading.Tasks.Parallel.For 循环的循环体很小时,它的执行速度可能比等效的顺序循环更慢。 对数据进行分区所涉及的开销以及调用每个循环迭代上的委托的开销导致了性能降低。
恩,其实原因就是所谓的循环体太小,这里的循环体太小,其实这里不是指代码的长度,而是指循环体里面做的事情是否比较费时。其实改写成下面这样
private static void Right()
Stopwatch watch = new Stopwatch();
watch.Start();
Parallel.For(0, 50, p =>
{
WebClient wb = new WebClient();
string content = wb.DownloadString(@"http://www.baidu.com");
});
watch.Stop();
long tempParallelTime = watch.ElapsedMilliseconds;
watch.Restart();
for (int i = 0; i < 50; i++)
{
WebClient wb = new WebClient();
string content = wb.DownloadString(@"http://www.baidu.com");
}
watch.Stop();
Console.WriteLine("顺序执行用时:" + watch.ElapsedMilliseconds);
Console.WriteLine("并行库用时:" + tempParallelTime);
}
就会发现
并行库用时明显少了,当然,这里其实更应该用thread.sleep模拟下就好,毕竟访问外部IO是不太稳定的,不过这已经足够说明问题了。写这类并行代码需要注意的地方很多,一个不留神,很有可能比顺序执行更慢。
又一个有趣的面试题里看到的一道题目,原因看过《深入计算机体系结构》应该就能明白。
题目如下
有两个相同功能代码如下,请在在A,B,C是什么的情况下,请给出三个原因case 1比case 2快,还有三个原因case 2会比case 1要执行的快。(不考虑编译器优化)
|
for (i=0; i<N; ++i){
A; B; C; } |
|
for (i=0; i<N; ++i){
A; } for (i=0; i<N; ++i){ B; } for (i=0; i<N; ++i){ C; } |
int[,] a = new int[length , length ];
int[,] b = new int[length, length];
int[,] c = new int[length, length];
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < length; i++)
{
int temp = 0;
temp = a[i, i];
temp = b[i, i];
temp = c[i, i];
}
watch.Stop();
Console.WriteLine(“case 1:” + watch.ElapsedMilliseconds);
watch.Restart();
for (int i = 0; i < length; i++)
{
int temp = 0;
temp = a[i, i];
}
for (int i = 0; i < length; i++)
{
int temp = 0;
temp = b[i, i];
}
for (int i = 0; i < length; i++)
{
int temp = 0;
temp = c[i, i];
}
watch.Stop();
Console.WriteLine(“case 2:” + watch.ElapsedMilliseconds);
#encoding=utf8
__author__ = 'Administrator'
#如果是直接运行文件的话
if __name__=="__main__":
print("main")
#怎么做性能测试
import time
def timer(reptimes,func,*pargs,**kargs):
start=time.clock()
for i in range(reptimes):
func(*pargs,**kargs)
return time.clock()-start
def test(test):
[i for i in range(test)]
print(timer(100,test,100))
#字符串格式化
print("{0}-{1}-{2}".format(1,1,1))
print("{name}-{age}".format(name="name",age="age"))
#代替linq
x=range(10)
print(str(x))
#解析表达式 速度最快
x1=[i for i in x if i%2==0]
print(x1)
x2=x[0::2]
print(x2)
x3=list(map((lambda i:i%2==0 and i or None),x))
print(x3)
x4=list(filter(lambda i:i%2==0,x))
print(x4)
#普通类
class Person(object):
def __init__(self,name,age):
self._name=name
self._age=age
@property
def name(self):
return self._name
@name.setter
def name(self,value):
self._name=(value+"...")
@name.deleter
def name(self):
raise RuntimeError("no")
@staticmethod
def Run(someone):
if isinstance(someone,Person):
print("run")
else:
raise RuntimeError("只有人能跑")
def __str__(self):
return "my name is "+self._name+" i'm "+str(self._age)
john=Person("john",11)
print(john)
Person.Run(john)
#Person.Run(1)
john.name="john"
print(john)
#del john.name
#演示继承
class Man(Person):
def __init__(self,name,age,sex):
super(Man,self).__init__(name,age)
self.sex=sex
def __str__(self):
return super(Man,self).__str__()+self.sex
man=Man("man",21,"男")
print(man)
from abc import abstractmethod,abstractproperty,ABCMeta
#抽象类
class abClass():
__metaclass__=ABCMeta
@abstractmethod
def abMethod(self):
pass
@abstractproperty
def abPr(self):
pass
#abEntity=abClass()
#演示AOP
class trace(object):
def __init__(self,func):
self.func=func
def __call__(self, *args, **kwargs):
print("------begin------")
print(dir(self.func))
print(self.func.__code__)
self.func(*args,**kwargs)
print("----------end----------")
#演示AOP
def mydecorator(func):
def _mydecorator(*pargs,**kargs):
print("ffff")
res=func(*pargs,**kargs)
return res
return _mydecorator
def complexDecorator(name):
def _mydecorator(func):
def _mydecorator(*pargs,**kargs):
print(name)
res=func(*pargs,**kargs)
return res
return _mydecorator
return _mydecorator
@complexDecorator("bw")
@mydecorator
@trace
def demoTrace():
print("me")
demoTrace()
应合作伙伴的要求,特写一篇python和django的安装教程。
项目是在python2.x上构建的,因为django还没有支持3.x的准备,要用到的mysql-python在2.6和2.7上安装还有些区别,2.6略微麻烦点,2.7要简单些。
1、先装python2.7,因为是exe安装了,步骤很简单,选个目录,next就好。
图

检查下环境变量Path里有没有F:\Python27;F:\Python27\Scripts,这两段,盘符路径什么的自己替换下,如果没有就添加一下,以后用的着。
2、安装完就安装MySQL-python-1.2.3.win32-py2.7,这个东西如果是从官网下载自己编译简直就是噩梦,如果是linux下就没有这样的烦恼。。。,所以就去下了好心人编译的win32版本,ok,只要你安装了python,他就会根据你的path自动安装。
图

先打开python的命令行,import _mysql还有import MySQLdb测试下
图

如果没有发生异常就表示安装成功了。
3、安装django1.3,先用命令行进入django1.3的文件目录,然后执行python setup.py install 命令,ok,自动安装。
4、ok了,先找个地方试试安装是否成功
用命令行进入某个文件夹执行如下命令
django-admin.py startproject demo创建一个django目录,demo项目,如果没有报错,然后在进入这个demo目录,执行 python manage.py runserver 8080 ,看到界面上会显示启动了一个web服务器,把url地址拷下,找个地方执行,只要安装正确就可以看到欢迎界面。ok。
5、安装ide,我比较喜欢的ide是jetbrains,当然用的是破解版。。。
这是PyCharm v1.x的注册码
Username: caisong.com
注册码:
===== LICENSE BEGIN =====90689-1204201000003L7zwGXeVO9Em24bBMek8H21J8bLcmGDBv0o5QGJFBfvHaGeXifdM5RhCETJS4WLZSDbafl6yXh6zWEjKNo3PW===== LICENSE END ===== |
当然上面都是很顺利的情况,如果是在2.6下安装,就有些小问题要处理。
import MySQLdb。出现ImportError: DLL load failed: 找不到指定的模块。是因为发现缺少2个dll文件分别为 libguide40.dll和libmmd.dll。下载之后,然后复制到 WINDOWS\system32 。这个问题就这样解决了。
import MySQLdb。再出现sys:1: DeprecationWarning: the sets module is deprecated 的错误,再次搜索,原因是2.6不知sets这个模块,不过已经添加了set内置函数。找到MySQLdb文件夹的中__init__.py,注释掉from sets import ImmutableSet
class DBAPISet(ImmutableSet):添加class DBAPISet(frozenset):;找到converters.py注释掉from sets import BaseSet, Set。然后修改第45行和129行中的Set为set。
当然如果要用apache这样的生产环境测试下步骤更麻烦= =,那是以后的事情就是了。。。
此人二十有七,山野村夫,求学之时举家徙至榕城。
近三十而不通人情,不思置产业,空谈理想,幼稚如少年。
不知情为何物,几近不惑却仍愚笨至极。
手不释卷,不求甚解。
虽常为后进,然好为人师,喜渡人,难自渡。
友虽少,皆耿直之辈,众人尝谓此君曰“搓”。
呜呼,敢问诸君,尚可救否?后学诸君须引以为戒,不可效此君模样。
之前看过百姓网的分享PPT,里面提到用谷歌统计来做页面加载时间的调查,这几天就看到一篇类似的文章。
http://www.biaodianfu.com/google-analytics-page-loading-time.html
转载如下
Google Analytics可以用来记录网站的加载时间或网页内各个模块的加载时间,其实整个原理非常的简单,只是记录页面呢不同位置javascript的执行时间,两者相减即加载时间。比如我想知道用户加载页面中head部分JS和CSS的时间和加载页面中主体内容body的时间。具体实现方式如下:
1、在页面head中CSS和JS文件加载前添加如下代码:
<script type="text/javascript">var _head_start = new Date();</script>
2、在页面<body>位置后面添加下面的代码:
<script type="text/javascript">var _body_start = new Date();</script>
3、在页面页脚中,即</body>前添加下面的GA代码:
<script type="text/javascript">var _now= new Date();</script>
4、通过Google Analytics的事件跟踪将加载时间记录下来:
<script type="text/javascript";> if (typeof(_head_start)==typeof(_now)) { if (_now-_head_start<1000*10) { _gaq.push(['_trackEvent', 'Performance', 'head', '/pagepath/', _now-_head_start]); _gaq.push(['_trackEvent', 'Performance', 'body', '/pagepath/', _now-_body_start]); }else{ _gaq.push(['_trackEvent', 'Performance', 'slow head', '/pagepath/', _now-_head_start]); _gaq.push(['_trackEvent', 'Performance', 'slow body', '/pagepath/', _now-_body_start]); } } </script>

