分类
Uncategorized

VBA类对象的GC效率问题

[起因] 在用VBA处理数据时发现,如果向Microsoft Scripting Runtime类库的字典对象中添加约10万个的类(Class)对象,在脚本跑完时会卡住几秒才恢复;当类对象数量达到约16万个时,卡住的时间会达到十几秒。

[问题原因] 经过排查和搜索相关讨论,发现问题很可能是由于VBA的垃圾回收(garbage collection)造成的。VBA的GC机制是,当对象的引用数量变为零时,则清除该对象。但由于未知的原因,该GC机制的时间复杂度似乎是O(n²),一旦对象数量大幅增加,GC的时间就会显著增长。

时间与对象数量的关系

为了验证该问题,写了一小段代码向Collection对象塞入指定数量的myClass对象,代码见文末,结果如上图。从图中可以明显发现,创建对象所需时间(蓝线)基本上是线性增长,但清除对象所需时间(红线)却是二次函数增长,当对象数量在30万时,创建只花费0.8秒,但清除却花了近12秒。

[其他发现] 经过进一步测试还有些其他发现:

  • 只有内容为类对象才存在该问题,对于类型(例如integer, string, UDT等)不存在该问题,因为这些并不是对象,不存在引用数量归零时清除垃圾问题。
  • 当容器为对象(例如Dictionary, Collection等)时,该问题可以稳定复现;当容器为数组(Array)时,该问题的复现不稳定。
  • 只有当类实例化后才存在该问题,只声明类变量并没有该问题。这很容易理解:既然对象没有实例化,自然无需GC。

[解决方法] 由于该问题过于基础,并未找到很好的解决方法。缓解方法包括:

  • 避免使用类(Class),而是使用自定义类型(UDT, user-defined type)。但有太多需求是UDT无法满足的。
  • 只在有必要的时候才实例化对象。
  • 改用其他语言。

[附录] 测试用代码

Option Explicit

Sub TestScrrunClassSpeed()
    Dim c As New Collection     'Scripting.Collection
    Dim rgIO As Range           'Range for input/output
    Dim arrIO As Variant        'Temporary array for input/output
    Dim i As Long               'Iterator
    Dim testnr%, qty As Long    'The # and object quantity of each test
    Dim t!(0 To 2)              'The start time, create time and destroy time
    
    'Read parameter from sheet: column A defines object quantity of each test
    Set rgIO = Sheets("Result").Range("A2:C31")
    arrIO = rgIO.Value
    
    'Do each test
    For testnr = LBound(arrIO) To UBound(arrIO)
        'Read object quantity and prepare
        qty = CLng(arrIO(testnr, 1))
        t(0) = Timer
        
        'Create class objects
        For i = 1 To qty
            c.Add New myClass
        Next i
        t(1) = Timer
        
        'Clear class objects
        Set c = Nothing
        t(2) = Timer
        
        'Calculate the time
        arrIO(testnr, 2) = (t(1) - t(0)) * 1000
        arrIO(testnr, 3) = (t(2) - t(1)) * 1000
    Next testnr
    
    'Write result to sheet
    rgIO.Value = arrIO
End Sub
分类
Uncategorized

失败的设计:Microsoft Office 2019新界面

2018年10月,微软发布了新的Office 2019,界面总体设计基本上没有太大变化,但这版UI的变动算是十几年来最差的一届。

1. 缺乏分界线的选项卡

微软从Office 2007 (Win Vista)起引入了功能区(Ribbons),取代了原先的菜单设计。典型的功能区包括用来切换不同功能组的选项卡(Tabs)和包含各种命令按钮的工具区域。

分类
Uncategorized

Microsoft Office 点滴经验

陆续记录一些琐碎却关键的MS Office经验,持续更新。

分类
Uncategorized

利用SD卡和NTFS软链接配置Windows 10 Mobile的IKEv2 VPN

如上一篇日志所述,Windows 10 Mobile由于微软莫名其妙的改动,导致通过“设置”界面配置的IKEv2 VPN根本无法使用,在没有MDM的情况下难以解决。
不过XDA-DevwfunWindowsCentral上有人找到了解决方法。

分类
Uncategorized

关于Strongswan配置证书登录的IKEv2 VPN

本文不涉及完整的IKEv2配置教程,有需要的可参照Vultr的教程

纯证书登录,即服务器端、客户端认证均使用证书,而非PSK(预共享密钥)。
优点:比弱密码安全;不会被随口泄露;无需分享服务器密钥,服务器端很难被伪造。
缺点:各种配置相当繁琐。

网上大部分配置一般是服务器端PSK+客户端PSK(常见于IKEv1),或服务器端证书+客户端PSK(常见于IKEv2),对于个人或少数朋友之间共享来说完全够用(只要PSK不是弱密码),但是对于较多人或一个组织来说,使用证书认证会更加合适。以下在一般配置的基础上说一下证书认证的配置和注意点。

分类
Uncategorized

CentOS 7 安装 ocserv (OpenConnect Server) 并实现证书登录

标题写的是CentOS 7,其实RedHat系各发行版通用。
ocserv在CentOS 6上必须自行编译,且需要解决诸多依赖性问题,但在CentOS 7上配置相当容易。

申请服务器证书

生成CSR

cd ~
openssl req -new -newkey rsa:4096 -sha256 -nodes -out server.csr -keyout server.key

接下去的提示中,只有Common Name需要填写服务器域名,其他都可以留空。
不建议生成ECC证书,因为即使是正规CA签发,AnyConnect客户端也会提示不安全。

拿着生成的CSR文件,到沃通或StartCom或其他证书商签发。
如果签名算法可选,务必选择SHA-2,不要用SHA-1。

沃通号称的快速签发只针对付费用户,对免费用户是工作时间人工审核签发。所以我把申请证书这一步放在最前面。

分类
Uncategorized

在 CentOS7/SL7 系统上通过网页安装 WordPress 插件

RHEL7/CentOS7/SL7 默认启用了 SELinux,因此一些第6版可用的操作在第7版不能使用。
例如,你如果从默认库安装 Apache,然后又安装了 WordPress,那就无法通过网页(FTP)直接安装插件。因为 Apache 会尝试连接 FTP 并通过 FTP 读写文件,但这种行为会被 SELinux 阻止。

解决方法是用以下命令修改 SELinux 的几个设置:
setsebool -P httpd_can_connect_ftp=1
setsebool -P httpd_can_network_connect=1
setsebool -P ftpd_full_access=1
如果你的FTP使用被动模式,还需要用这条命令:
setsebool -P ftpd_use_passive_mode=1
其中 -P 表示这条规则永久启用(否则系统重启后就会失效)。

当然,你也可以输入 setenforce 0 将 SELinux 从默认的强制模式改为允许模式,但我不推荐这么做。

分类
Uncategorized

服务器母机重启

服务器母机维护了约1小时并重启——连续在线520-550天左右。
对于非云服务器来说算挺不错。

分类
Uncategorized

又到大热天了

换张壁纸、换个浏览器风格凉快些。
Firefox 30.0 + Classic Theme Restorer + GlassMyFox + Stylish

Transparent Firefox
Customized transparent Firefox

分类
Uncategorized

IE11浏览器CPA考试无法报名的解决办法

用IE11浏览器无法完成报名,因为次级下拉菜单没有选项可选(如下)。

IE11-CPA-Reg-1
IE11次级下拉菜单无法选择

解决方法很简单,按F12,文档模式选择7即可。

IE11-CPA-Reg-2
文档模式切换到IE7即可

尝试过文档模式改为10,9,8都不行,只有选7才能填写所有信息并进入下一步。