WRITING LOG · 03

技术博客

记录技术实践、问题排查和持续成长,把每一次解决问题的过程留下来。

WORKSPACE

文章阅读

在网页上玩红白机游戏:基于jsnes的nes模拟器
2024-06-27
小霸王和街机游戏是童年的色彩,虽然现在玩起来已经找不回小时候的味道。看到网页上也能运行nes游戏还是想缅怀一下。
官方demo:https://jsnes.org/
自己做的demo:https://p1.nextfix.cn/
jsnes的github地址:https://github.com/bfirsh/jsnes
原理倒是不复杂,就是把红白机的游戏ROM的画面和声音读取并模拟再通过浏览器canvas绘制处理。可是看源码实现还是挺复杂的,给作者点个赞。
我这边是直接用github项目里的example跑起来的。
美中不足的是有很多ROM都跑不起来,比如我最喜欢的火炮《Gun Dec》,还有64 in 1这类合集基本都不行。而且到我写日志为止也没找到不刷网页直接加载ROM的方法,直接原网页切换游戏有问题只好先作罢。
lua和php的性能比拼
2024-06-26
lua脚本被广泛用于游戏,也许是得益于skynet框架的大行其道。lua亲C语言,轻量,语法友好,支持多线程,优点很多。但是作为一名PHP拥趸者自然更亲PHP的,哪怕在网络舆论上PHP似乎已经不再受欢迎。用lua写一些业务逻辑的时候发现执行效率不是很理想,最后同事对我的代码做了很多优化并且加入了多线程才达到了预期的效果。这让我对lua这个号称速度最快的脚本性能产生了质疑,接下来跟PHP做了个简单的性能测试。
首先运行环境是在Ubuntu server22.04.3上,CPU为i5-9400F 6核 2.9GHZ, 8G内存,256G的三星ssd + 1TB机械盘。
lua版本是5.4.4,PHP版本是8.1.2。
先测试了50万个0到9999的随机数字生成并用逗号拼接写入到文本中的耗时。
lua代码如下:
function tt()
  local tab = {}
  for i=1, 500000, 1 do
    table.insert(tab, math.random(0, 999))
  end
  local file, err = io.open("example.txt", "w")
  file:write(table.concat(tab,","))
  return #tab
end
local stime = os.time()*1000 + os.clock()*1000
print(stime)
print(tt())
local etime = os.time()*1000 + os.clock()*1000
print(etime)
print("总耗时:",etime-stime,"毫秒")
temp.lua运行10次平均下来耗时229毫秒。
php测试代码如下:
function tt(){
 $a = [];
 for($i=0; $i<500000; $i++){
   $a[] = mt_rand(0, 9999);
 }
 $f = fopen("temp.txt", "w");
 fwrite($f, implode(",",$a));
 fclose($f);
 return count($a);
}
$stime = microtime(true) * 1000;
echo $stime."\n";
echo tt()."\n";
$etime = microtime(true) * 1000;
echo $etime."\n";
echo "总耗时".($etime-$stime)."毫秒\n";
10次下来平均耗时45.5毫秒左右。
测试结果总的来说不开多线程lua不占优势,也可能是测试样例的问题。
接下来也用上面的代码测试了nodejs和golang,go毕竟是编译型语言,维持在30多毫秒的样子。nodejs和PHP耗时比较接近。相较于老版本,PHP8开始确实有不小性能提升。不过编程语言终究只是工具,业务逻辑和算法对速度影响更大。
AWS EC2 在线扩容磁盘(不停机)
2024-06-21
公司的项目把数据库建在了亚马逊的ec2上,逻辑服务也在上面,硬盘经常不够用又不能停机。在aws后台增加服务器的硬盘后不重启的话就只能手动调整分区来让扩容的硬盘空间生效了。总共只需要3步:
1.用命令lsblk查看硬盘情况得到分区名称和序号。
2.去亚马逊控制台找到服务器的硬盘修改大小。
3.用命令growpart 分区名称 分区序号。
实操:
#查看硬盘分区情况
lsblk
#列出硬盘分区情况大概如下:
NAME   MAJ:MIN  RM  SIZE  RO  TYPE  MOUNTPOINT
nvme0n1    259:0    0   100G   0  disk  
└─nvme0n1p1  259:1     0   100G  0  part  /
#记住上一步改变分区前的情况,nvme0n1p1是分区名,序号是MAJ:MIN那列分号后的1,然后登录到aws控制台,选择EC2 - 存储 -操作 - 修改卷,扩展为想要的大小,这里示范扩容成200G
#让扩展出来的硬盘空间生效
growpart /dev/nvme0n1p1 1
#上面的命令没报错的话用命令df -h就能看到扩容后的硬盘使用情况了